首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在纯程序集中调用ecrecover()?

如何在纯程序集中调用ecrecover()?
EN

Ethereum用户
提问于 2019-09-30 02:51:07
回答 1查看 395关注 0票数 0

如果我没记错的话,这是一份内置在Ethereum虚拟机中的合同,不是吗?

如果是,地址是什么?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2019-09-30 10:40:04

ecrecover地址是:0x01

如果没有程序集,您可以像这样调用ecrecover函数:

代码语言:javascript
复制
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);
}

装配(一种可能的备选方案):

代码语言:javascript
复制
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)
    }
}

示例:

代码语言:javascript
复制
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中添加相同的字符串。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/76346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档