如果我没记错的话,这是一份内置在Ethereum虚拟机中的合同,不是吗?
如果是,地址是什么?
发布于 2019-09-30 10:40:04
如果没有程序集,您可以像这样调用ecrecover函数:
function recoverEC_Method1 (bytes32 _hash, bytes32 _r, bytes32 _s, uint8 _v) public pure returns (address) {
bytes memory prefix = "\x19Ethereum Signed Message:\n32";
bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, _hash));
return ecrecover(prefixedHash, _v, _r, _s);
}装配(一种可能的备选方案):
function recoverEC_Method2 (bytes32 _hash, bytes32 _r, bytes32 _s, uint8 _v) public view returns (address) {
bytes memory prefix = "\x19Ethereum Signed Message:\n32";
bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, _hash));
assembly {
let pointer := mload(0x40)
mstore(pointer, prefixedHash)
mstore(add(pointer, 0x20), _v)
mstore(add(pointer, 0x40), _r)
mstore(add(pointer, 0x60), _s)
if iszero(staticcall(not(0), 0x01, pointer, 0x80, pointer, 0x20)) {
revert(0, 0)
}
let size := returndatasize
returndatacopy(pointer, 0, size)
return(pointer,size)
}
}示例:
bytes32 _hash = 0x852daa74cc3c31fe64542bb9b8764cfb91cc30f9acf9389071ffb44a9eefde46;
bytes32 _r = 0xb814eaab5953337fed2cf504a5b887cddd65a54b7429d7b191ff1331ca0726b1;
bytes32 _s = 0x264de2660d307112075c15f08ba9c25c9a0cc6f8119aff3e7efb0a942773abb0;
uint8 _v = 0x1b;
address = 0xa6fb229e9b0a4e4ef52ea6991adcfc59207c7711有关前缀的更多信息,请阅读以下问题。
在对所有数据进行签名(
\x19Ethereum Signed Message:\n<length of message>)之前,TL;DR;Geth将字符串https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_签名加到它的前面。如果要验证这样的签名是否可靠,则在执行ecrecovery之前,必须在Solidity中添加相同的字符串。
https://ethereum.stackexchange.com/questions/76346
复制相似问题