我不能让它起作用。我从这了解到,TREZOR在签名之前添加了消息的神奇消息和十六进制消息长度(而不是ASCII长度)。
在发送到geth进行验证之前,是否不可能通过预先处理相同的数据来操作给定的明文消息?
发布于 2018-02-09 23:42:33
我怀疑您不能使用geth的web3.personal.ecRecover函数来完成这个任务,因为它会自动添加前缀的样式。但只要添加正确的前缀TREZOR样式,就可以使用ecrecover的任何底层实现,比如web3.js中的实现。下面的代码使用web3.js和空灵验证签名:
const Web3 = require('web3');
const web3 = new Web3(null);
const message = '3fehlpNqurkHvsEGXYVvDvh5xlxRHQMe';
const signerAddress = '0x3278312c573f9c0ced9b3c381b428f1821de29a4';
const signedMessage = '0x6b673ad119bfba39788be3ea8ada062b74c15806a5d0520e3294817a87884a776b835dd5177f64449bd2a9445fa763ef3c3530000f317e15be54fd02480385921b';
// NOTE: Proper varint encoding is necessary for larger lengths.
const prefix = '\x19Ethereum Signed Message:\n' +
String.fromCharCode(message.length);
const stringToSign = prefix + message;
const recovered = web3.eth.accounts.recover(web3.utils.keccak256(stringToSign),
signedMessage);
if (recovered.toLowerCase() == signerAddress.toLowerCase()) {
console.log('Address recovered successfully via web3.js.');
}
const ethUtil = require('ethereumjs-util');
const sig = ethUtil.fromRpcSig(signedMessage);
const publicKey = ethUtil.ecrecover(ethUtil.sha3(stringToSign),
sig.v, sig.r, sig.s);
const recovered2 = ethUtil.bufferToHex(ethUtil.pubToAddress(publicKey));
if (recovered2.toLowerCase() == signerAddress.toLowerCase()) {
console.log('Address recovered successfully via ethereumjs-util.');
}https://ethereum.stackexchange.com/questions/39151
复制相似问题