织梦CMS - 轻松建站从此开始!

我的网站

当前位置: 主页 > 竞争币 > 以太坊

硬核 | 技术详解密码学签名在以太坊上应用 (7)

时间:2020-10-22 17:17来源:未知 作者:admin 点击:
= keccak256(abi.encodePacked(prefix, hash)) ; return ecrecover(prefixedHash, v, r, s) ; } /** * @notice Checks if the recovered address from an ECDSA signature is equal to the address `signer` provide
= keccak256(abi.encodePacked(prefix, hash)); return ecrecover(prefixedHash, v, r, s); } /** * @notice Checks if the recovered address from an ECDSA signature is equal to the address `signer` provided. * @return valid Whether the provided address matches with the signature */ function isValid (address signer, bytes32 hash, uint8 v, bytes32 r, bytes32 s) external pure returns (bool) { return recoverAddress(hash, v, r, s) == signer; } }

该合约仅用于验证签名,本身没有任何用处,因为签名验证也可以在没有智能合约的情况下完成。

这种方式的用处在于,用户可以通过免信任方式向智能合约发送某些指令,而无需发送交易。例如,用户可以签署一条消息:「请从我的地址向该地址发送 1 个以太币。」 智能合约可以使用 EIP-712 和 / 或 EIP-1077 标准来验证签名者并执行该指令。智能合约中的签名验证可用于以下应用:

  • 多签合约(如 Gnosis Safe);
  • 去中心化交易所;
  • 元交易和 gas 中继者(如 Gas Station Network)。

但是,如果你想通过正在使用的智能合约钱包签署消息怎么办?我们显然不能让钱包智能合约访问私钥对吧。ERC 1271 提议了一个标准,可以让智能合约验证其它智能合约的签名。其规范非常简单:

pragma solidity ^0.7.0; contract ERC1271 { bytes4 constant internal MAGICVALUE = 0x1626ba7e; function isValidSignature( bytes32_hash, bytes memory_signature ) public view returns (bytes4 magicValue); }

合约必须实现 isValidSignature 函数,该函数可以像上述合约那样运行任意函数。如果签名确实是与合约对应的,则函数返回 (责任编辑:admin1)

织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容