如何解决我无法在智能合约中使用 ecrecover 获取签名者地址
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;
contract Example {
function signature(uint256 tokenId,uint8 v,bytes32 r,bytes32 s) public view returns(address) {
return ecrecover(keccak256(abi.encodePacked(this,tokenId)),v,r,s);
}
JavaScript 代码:
async function sign(){
var message = 1001
var orgmessage = web3.eth.abi.encodeParameter('uint256',message)
var orginal = `0xf8e81D47203A594245E36C48e151709F0C19fBe8${orgmessage.slice(2)}`
var hash = web3.utils.keccak256(orginal);
const accounts = await getCurrentAccount();
var signature = await web3.eth.personal.sign(hash,accounts);
var sig1 = signature.slice(2)
var r = `0x${sig1.slice(0,64)}`
var s = `0x${sig1.slice(64,128)}`
var v = web3.utils.toDecimal(`0x${sig1.slice(128,130)}`)
console.log("h",hash)
console.log("v",v)
console.log("r",r)
console.log("s",s)
}
预期签名者地址:0x4CA95df0400676Eb6818Be4601793Af36450F862
实际签名人地址:0x04a02De5b8B422feb7949D4b7cB690aF746Da34E
在我使用 web3.eth.sign 方法对消息进行签名之前,合同正确返回签名者地址。但此签名方法已被弃用。
所以现在我正在尝试使用 web3.eth.personal.sign 用智能合约地址签署一个整数值,不幸的是它没有正常工作。 如果有人知道如何解决这个问题,请帮助我!
解决方法
但它是什么abi.encodePacked(this,tokenId))
?它不会工作。
你首先需要一个前缀。
function _messageToRecover(address erc20Contract,address destination,uint256 value) private view returns (bytes32) {
bytes32 hashedUnsignedMessage = generateMessageToSign(erc20Contract,destination,value);
bytes memory message = bytes32_to_hstring(hashedUnsignedMessage);
bytes memory prefix = "\x19Ethereum Signed Message:\n64";
return keccak256(abi.encodePacked(prefix,message));
}
其中 \n64
是(我的)味精长度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。