ethereum sign and check
var Web3 = require('web3'); const keccak256 = require('keccak256') var web3 = new Web3(); console.log("version :", web3.version); var pv = ''; // load address var ac = web3.eth.accounts.privateKeyToAccount(pv); console.log(ac); // data privatekey var message = "0x" + keccak256('hello').toString('hex'); //another way keccak256(Buffer.from('hello')).toString('hex') console.log("msg hash is ",message); var signature = web3.eth.accounts.sign(message, pv); console.log("signature :", signature); var messageHash= web3.eth.accounts.hashMessage(message); // recover 1 var recover_1 = web3.eth.accounts.recover({ messageHash: messageHash, v: signature.v, r: signature.r, s: signature.s }); console.log("recover 1 :", recover_1); // message, signature var recover_2 = web3.eth.accounts.recover(message, signature.signature); console.log("recover 2 :", recover_2); // message, v, r, s var recover_3 = web3.eth.accounts.recover(message, signature.v, signature.r, signature.s); console.log("recover 3 :", recover_3);
// contracts/MyContract.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; contract Demo { using ECDSA for bytes32; event Log(bytes32 dataHash); event Log2(address mess); address public signer; constructor(){ signer = 0x; } function verify(bytes32 hash, bytes memory signature) public returns (bool) { bytes32 ethSignedHash = hash.toEthSignedMessageHash(); emit Log(ethSignedHash); address res = ethSignedHash.recover(signature); emit Log2(res); return ethSignedHash.recover(signature) == signer; } function verify2(bytes32 ethSignedHash, bytes memory signature) public returns (address) { address res = ethSignedHash.recover(signature); return res; } function main( // Verification bytes memory signature, // Data string calldata data ) public returns (bool){ bytes32 txHash = keccak256(abi.encodePacked(data)); require(verify(txHash, signature), "Beta: Unauthorised"); return true; } function getHash(string calldata data) external { bytes32 dataHash = keccak256(abi.encodePacked(data)); bytes32 ethSignedHash = dataHash.toEthSignedMessageHash(); emit Log(ethSignedHash); } function msgHash(string calldata data) external { bytes32 dataHash = keccak256(abi.encodePacked(data)); emit Log(dataHash); } }
参考文献
https://solidity-by-example.org/hashing/ Use Keccak256
web3.js sign
https://web3js.readthedocs.io/en/v1.2.4/web3-eth-accounts.html?highlight=web3.eth.accounts#privatekeytoaccount
openzeppelin 4.x
https://docs.openzeppelin.com/contracts/4.x/api/utils#ECDSA-toEthSignedMessageHash-bytes-