首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ethers.js错误签名

ethers.js错误签名
EN

Ethereum用户
提问于 2020-09-24 17:45:16
回答 1查看 2.6K关注 0票数 1

从ethers.js和secp256k1中相同的私钥中,我得到相同的eth地址。但是如果我在一条消息上签名,我会在ethers.js中得到一个不同的(错误)签名。我的密码怎么了?

代码语言:javascript
复制
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")
EN

回答 1

Ethereum用户

回答已采纳

发布于 2020-09-24 18:51:04

Ethers.js在签名前以\x19Ethereum Signed Message:\n<message length>作为签名的前缀,并对消息的散列进行签名。这相当于personal_sign JSON方法。要将Ethers.js的行为与secp256k1库相匹配,您必须:

  1. 使用e获取消息( Keccak256(message) )的散列。
  2. 散列e,使用Keccak256("\x19Ethereum Signed Message:\n32" + e)。我们可以在这里硬编码32长度,因为Keccak-256散列总是32字节(= 256位)长。
  3. 使用私钥对结果哈希进行签名。

签名{r, s, v}应该是一个有效的Ethereum签名,其中rs分别是前32个字节和第二个32个字节,v是最后一个字节(也称为恢复ID)。请注意,您可能必须将27添加到v参数中,才能获得27或28的v (如Ethereum所用)。

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/87743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档