Ethereum 如何使用元掩码进行签名和验证

Ethereum 如何使用元掩码进行签名和验证,ethereum,solidity,web3js,Ethereum,Solidity,Web3js,我需要连接一个字符串(test1)和合同地址(address)(this)。这是我的智能合同 pragma solidity ^0.6.2; pragma experimental ABIEncoderV2; contract Sample { function getContractAddress() public view returns (address) { return address(this); } function verify

我需要连接一个字符串(test1)和合同地址(address)(this)。这是我的智能合同

pragma solidity ^0.6.2;
pragma experimental ABIEncoderV2;

contract Sample {
    function getContractAddress() public view returns (address) {
        return address(this);
    }
    
    function verifySign(uint8 v, bytes32 r, bytes32 s) public view returns (address) {
        return ecrecover(keccak256(abi.encodePacked("test1", address(this))), v, r, s);
    }
}
使用以下代码,我在metamask中对消息进行签名

var account = window.ethereum.selectedAddress
var msg = window.web3.utils.sha3(web3.utils.toHex("test1") + "0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8", {encoding:"hex"})
var signature = await window.web3.eth.personal.sign(msg, account);
var r = signature.substr(0,66)
var s = "0x" + signature.substr(66,64)
var v = 28
但solidity合同中的
verifySign
返回值与account(用于签署消息的地址)不同

帮我找出我在这里遗漏了什么 编辑:

阅读后,我修改了我的合同如下:

pragma solidity ^0.6.2;
pragma experimental ABIEncoderV2;

contract Sample {
    function getContractAddress() public view returns (address) {
        return address(this);
    }
    
    function signVerify(uint8 v, bytes32 r, bytes32 s) public view returns (address) {
        string memory text = "test1";
        address contractAddr = address(this);
       bytes32 message = prefixed(keccak256(abi.encodePacked(text, contractAddr)));
        return ecrecover(message, v, r, s);
    }
    
    function prefixed(bytes32 hash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }    
}
和javascript代码

var account = window.ethereum.selectedAddress
var msg = web3.utils.soliditySha3("test1","0xd9145CCE52D386f254917e481eB44e9943F39138")
var signature = await window.web3.eth.personal.sign(msg, account);
var r = signature.substr(0,66)
var s = "0x" + signature.substr(66,64)
var v = 28
但我还是没有得到签名