javascript - 我无法在智能合约中使用 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
(我的)味精长度在哪里。
推荐阅读
- php - 如何在 yii2 中安装没有 composer 的第三方库?
- java - Selenium 中的手动操作
- vim - 如何跳转到 VIM 中的类限定标签?
- javascript - 在带有图例的引导模式中显示甜甜圈/饼图
- html - 让 div 占据剩余宽度的 100%?
- vb.net - 大于 ~43,700 个字符的文本在 Datagridview Vb.net 中消失
- javascript - 量角器:自定义 ExpectedConditions - 属性更改
- c# - 如果剃刀视图被引用到视图模型而不是模型,则 Jquery 日历不起作用
- angular - 离子组件在离子标签页中不起作用
- android - 启动 websockets 传输 android 时出错