链资讯 链资讯
Ctrl+D收藏链资讯

SIGN:Solidity 中的 ecrecover 的应用_IGN

作者:

时间:

译文出自:登链翻译计划

译者:翻译小组

校对:Tiny熊

有没有想过Solidity中的ecrecover命令到底是怎么回事?

这都是关于签名和密钥的...

PublicKeyXKCD

什么是ecrecover?

你可能在Solidity合约中看到过ecrecover,并想知道这到底是什么。那么你遇到了EVM预编译ecrecover。预编译是一些提前被编译的智能合约的通用函数,所以Ethereum节点可以有效地运行这个函数。从合约的角度来看,这只是一个像操作码一样的单一命令。

看看下面的代码:

functionrecoverSignerFromSignature(uint8v,bytes32r,bytes32s,bytes32hash)external{addresssigner=ecrecover(hash,v,r,s);require(signer!=address(0),"ECDSA:invalidsignature");}

基本上,大家就是这样使用它,尽管还有更多的内容。不要在生产中实际使用上述代码,PatricioPalladino正确地指出了这一点。正确的方法是在本文底部的最后一个例子中。

Web3社交聊天工具Console Beta测试版上线:12月16日消息,Web3社交聊天工具Console已上线Beta测试版,旨在通过钱包登录和ENS域名身份验证等功能解决“垃圾信息”、“机器人”等社交网络现有的问题。此外,Console还提供支持投票、线程消息、事件、赏金和财库等工具,以帮助推动新兴加密社区的发展。(CoinDesk)[2022/12/16 21:48:32]

DontUnderstandMeme

那么,这一切意味着什么呢?假设你熟悉公钥密码学的基本概念,这将很容易理解。

你可能知道,每当你向以太坊网络发送一笔交易时,必须用你的私钥签署这笔交易。自然也假设以太坊节点有某种方式来验证签名是正确的。

这种验证签名的功能也同样添加到了智能合约上。有了这个功能,你可以验证更多的东西,而不仅仅是交易签名本身。事实上,你可以将任何数据传递给智能合约,对其进行散列,然后根据数据验证其签名。上面的代码中的签名是v、r和s的组合。

为什么我需要这个?

实际上,之前也有文章讨论了如何使用它的例子。这些例子包括:

MetaTransactions

无需gas代币和ERC20-Permit还任重而道远

从本质上讲,你可以验证一个签名数据,而这些数据不一定来自交易签署者。

知情人士:Solana正召集生态核心团队逐步排查受害者钱包,目前仍无法确定漏洞:8月3日消息,Solana生态开发者透露,目前Solana召集Phantom、Slope等生态核心团队,正在逐一比对排查受害者地址和交互过的应用记录,目前仍无法确定具体漏洞原因。(Odaily)[2022/8/3 2:55:13]

我应该使用哪个签名标准?

StandardsMeme

首先,我们需要决定签名的类型。虽然这对ecrecover来说这并不重要,但对签名来说,已经有几个标准可以被客户端使用以太坊密钥来签署数据:

eth_sign

personal_sign

EIP-712

eth_sign是用来签署任意数据。这使得它是最强大的,最简单的,但也是最危险的。这里的大问题是,你可以让用户签署一个数据,而这个实际上是交易数据。想象一下,你让用户登录到你的服务,但你让他们签署的数据实际上是一个交易,如"发送5个ETH给攻击者"。交易毕竟只是由字节组成,人们很可能不会检查他们所签署的这串字符的实际含义。看似无害的签名,却成了窃取资金的攻击。所以一般不鼓励直接使用eth_sign。

personal_sign后来加入来解决这个问题。该方法在任何签名数据前加上"EthereumSignedMessage:",这意味着如果有人要签署交易数据,添加的前缀字符串会使其成为无效交易。

BlockFi 将Solana、Avalanche和Polygon等主要加密货币的利率减半:5月27日消息,加密借贷平台BlockFi已将非美国客户持有的一些市场加密货币的利率降低了一半。自6月1日起,Solana存款的利率将从10%降至5%,而Avalanche(AVAX)和Polygon(MATIC)的利率将分别从10%降至5%和11%至5%。(The Block)[2022/5/28 3:46:41]

对于更复杂的用例,特别是在智能合约中使用时,EIP-712标准被创建。EIP-712标准随着时间的推移而有所改变,但目前MetaMask支持的最后一个版本是signTypedData_v4。或者你可以使用一个特定的库,如eip-712。EIP-712解决的主要问题是确保用户清楚地知道他们在签署什么,为哪个合约地址和网络签署,而且每个签名最多只能使用一次。简而言之,这是通过签署所有需要的配置数据的哈希值实际数据本身来实现的。ERC20-Permit是一个关于如何使用signTypedData_v4的好例子。

所有的函数都可以在与MetaMask交互时使用,见例子。另外,它们也可以使用eth-sig-util。

所以回到问题我应该使用哪种签名标准?从合约的角度来看,使用最新的EIP-712标准!eth_sign并不安全,personal_sign主要用于实现用户登录功能。在你的合同中坚持使用EIP-712。

Solana官方发布此前网络中断概述,原因为拒绝服务攻击:9月21日消息,Solana官方发布9月14日网络中断初步概述,社区正在编写详细的技术分析和根本原因分析报告,并将在未来几周内发布。据悉,9月14日,Solana网络离线17个小时。没有资金损失,网络在24小时内恢复了全部功能。网络停滞的原因是拒绝服务攻击。UTC时间12:00,Grape Protocol在Raydium上启动IDO,机器人生成的交易使网络拥堵。这些交易造成了内存溢出,导致许多验证节点崩溃,迫使网络变慢并最终停止。当验证节点网络无法就区块链的当前状态达成一致时,网络就会脱机,从而阻止网络确认新区块。[2021/9/21 23:39:52]

如何实现EIP-712

现在让我们看看如何在Solidity中实现EIP-712。大概的想法是:

计算一个域的哈希值,该值涵盖了合约地址和chainId的配置数据

计算结构化的数据哈希值

结合这两个哈希值,并在ecrecover中使用它。

我个人还建议增加一个nonce和deadline值,以防止重放攻击并确保在特定时间内执行。这些不是EIP-712标准的直接组成部分,但可以很容易地添加。下面你会发现一个例子,如何实现这些,然后加上合约的本身的参数去执行它:

functionexecuteMyFunctionFromSignature(uint8v,bytes32r,bytes32s,addressowner,uint256myParam,uint256deadline)external{bytes32eip712DomainHash=keccak256(abi

人物 | 前白宫CIO Carlos Solari已加入金融科技公司PlatinumDEX:据Pr.com消息,3月13日,总部位于伦敦的金融科技公司PlatinumDEX发布公告称,前白宫首席信息官(CIO)、网络安全专家Carlos Solari已加入该公司,出任首席信息官一职。据悉,PlatinumDEX的目标是构建世界上最安全的端到端加密货币交换平台。[2019/3/17]

ecrecover的安全问题解决方案

ecrecover有几个问题,在上面的代码中没有说明,但你应该注意:

在某些情况下,ecrecover可以返回一个随机地址,而不是无效签名的0。这一点可以通过结构化数据中加入所有者地址来防止。

签名是可塑的,这意味着你可能会为同一数据创建第二个同样有效的签名。在我们的案例中,我们没有使用签名数据本身。

如果哈希值不是在合约本身中计算的,攻击者可以构建一个看起来有效的哈希值和签名。

在实践中,我再次建议使用Openzeppelin合约。他们的ECDSA实现解决了所有这三个问题,而且他们还有一个EIP-712实现。这不仅更容易使用,而且他们还做了进一步的改进:

eip712DomainHash的缓存机制,所以只有在chainId改变时才会计算

如上所述,对签名的额外安全检查

能够以字符串形式发送签名

上面的代码将被简化为:

import"

这就是目前最新的EIP-721的第四版标准。如果你在其他合约中遇到EIP-712的实现,要注意使用的是哪个版本。

另外,最后也说明一下,调试无效的签名是非常痛苦的,因为任何数值的微小差异都会导致无效的签名,但你不知道哪些数据可能是错误的。因此,如果你遇到无效签名,一定要仔细检查你的所有输入。

另一个有趣的标准是EIP-1271。由于以太坊的智能合约背后没有私钥,所以它们不能创建那些v、r、s签名。但有了这个标准,仍然可以让合约本身创建签名,见我之前的文章的底部。

来源:WhatisecrecoverinSolidity?

参考资料

登链翻译计划:https://github.com/lbc-team/Pioneer

翻译小组:https://learnblockchain.cn/people/412

Tiny熊:https://learnblockchain.cn/people/15

EVM预编译:https://ethervm.io/#3F

ecrecover:https://docs.klaytn.com/smart-contract/precompiled-contracts#address-0x-01-ecrecover-hash-v-r-s

PatricioPalladino:https://twitter.com/alcuadrado

公钥密码学:https://en.wikipedia.org/wiki/Public-key_cryptography

MetaTransactions:https://soliditydeveloper.com/meta-transactions

无需gas代币和ERC20-Permit还任重而道远:https://learnblockchain.cn/article/1790

eip-712:https://github.com/Mrtenz/eip-712

ERC20-Permit:https://learnblockchain.cn/article/1790

例子:https://github.com/danfinlay/js-eth-personal-sign-examples

eth-sig-util:https://github.com/MetaMask/eth-sig-util

可塑的:http://coders-errand.com/malleability-ecdsa-signatures/

EIP-1271:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md

之前的文章:https://soliditydeveloper.com/meta-transactions

WhatisecrecoverinSolidity?:https://soliditydeveloper.com/ecrecover

免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。

本文来源于非小号媒体平台:

登链社区

现已在非小号资讯平台发布105篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/10138004.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

巨鲸的资金涌向哪里,哪里就是热点!

标签:SIGNIGNECOHTTSignataSignals NetworklanguagecoinCHTT币

中币交易所热门资讯
区块链:2021 年世界区块链大会能来的都是独角兽_htt币被

经过2018年到2020年前三届世界区块链大会的成功举办,目前该盛会已是国内规模举办过最大、规格最高、参与人数最多的区块链行业盛会之一.

STAR:Bibox将于2021年7月7日上线 Starbase (STAR)_RBASE

尊敬的Bibox用户: Bibox创新区将于2021年7月7日(UTC8)上线Starbase(STAR).

IGN:关于WBF上线MLN的公告_SOLID

尊敬的用户: WBF将在开放区掘金板块上线MLN/USDT交易对,具体上线时间如下:交易时间:2021/7/714:10 项目介绍: MLN是一种为Enzyme提供支持的以太坊代币.

HTT:XT关于即将上线 FESS 的公告_WHALECOM

尊敬的XT用户: XT即将在创新区开放FESS/USDT交易对。并同时支持主链和ERC20的充提通道,具体时间,请留意官方后期公告.

OMI:HomiEx(红米交易所)关于恢复BEAM充值和提现的公告_Nominex

亲爱的用户: BEAM节点升级完毕,HomiEx现已恢复BEAM的充值和提现。暂停期间给您带来的不便,敬请谅解! 加入我们官方社群: 动态 | 加密交易所QuadrigaCX前用户对安永和Mil.

区块链:币圈小蝶:区块链技术对银行业有什么影响?_区块链通俗易懂的说法

1、对区块链的兴趣很高 埃森哲得出的结论是,银行对区块链技术很感兴趣,但仍处于采用该技术的早期阶段,至少是大多数接受调查的银行.