火星链 火星链
Ctrl+D收藏火星链
首页 > USDC > 正文

IGN:Solidity 中的 ecrecover 的应用

作者:

时间:1900/1/1 0:00:00

译文出自:登链翻译计划

译者:翻译小组

校对: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正确地指出了这一点。正确的方法是在本文底部的最后一个例子中。

NFT市场Rarible或将增加对Solana网络的支持:3月23日消息,根据技术博主和应用程序研究员Jane Manchun Wong的分享,NFT市场Rarible有望增加对Solana网络的支持。Rarible已经设置了用于集成Solana的后端。此前3月17日消息,NFT市场Rarible宣布完成Polygon集成并将推出多链钱包。(U.today)[2022/3/23 14:12:35]

DontUnderstandMeme

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

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

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

为什么我需要这个?

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

MetaTransactions

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

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

跨链聚合协议iSwap正式上线Solana主网:近日,iSwap新增了Solana主网,这是继火币生态链、以太坊、币安智能链、OEC、Arbitrum、Fantom、Polygon和Avalanche之后,iSwap新增的又一公链网络。

此次升级支持Solana主网跨链交易,为用户提供更加丰富更加灵活的交易选择,用户可在iSwap体验3秒跨链交易,提高链上资产流动性。[2022/3/15 13:57:49]

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

StandardsMeme

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

eth_sign

personal_sign

EIP-712

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

SOL突破250美元:SOL突破250美元,现报250.4917美元,日内涨幅达到7.38%,行情波动较大,请做好风险控制。[2021/11/7 6:36:13]

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

对于更复杂的用例,特别是在智能合约中使用时,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基金会:Solana主网Beta版拥有896个质押验证者:Solana基金会发推称,“在像Solana这样的PoS网络中,最大化网络上高质量验证者的总数以及这些节点的权益分配非常重要。这就是我们创建Solana基金会委托计划的原因。委托计划通过战略性地将SOL委托给满足特定性能和去中心化标准的现有以及新验证者,促进Solana网络的发展和安全。自2021年6月以来,320多个验证者节点上线,反映出人们对Solana生态系统各个层面的兴趣激增。如今Solana主网Beta版拥有896个质押验证者,这些验证者位于28个国家的150个数据中心,拥有92个独立ASN。权益和实体基础设施的广泛分布有助于保持Solana网络的安全性和抵御攻击或故障的能力,确保每个人都可以随时访问该网络。”[2021/8/28 22:42:42]

如何实现EIP-712

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

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

计算结构化的数据哈希值

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

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

火币将于12月3日20:00上线SOL:据官方消息,火币全球站“主板创新区”定于2020年12月3日20:00上线SOL (Solana),同时开启“首周充值、首周交易、锁仓ETH/BETH,三重赚币SOL活动”。活动共计奖励10.8万SOL(价值约23万美元)。火币现已开放 SOL 的充币业务。

12月3日至12月10日上线首周,从外部地址向平台成功充值S的用户,将按照净充值数量瓜分总计2.5万 SOL代币奖励;在火币参与SOL现货交易的用户,将按照交易量排名,参与用户瓜分2万SOL 的奖励。

此外,12月3日至12月10日期间,用户将根据锁仓ETH/BETH份额瓜分6.3万SOL 。详情见官方公告。[2020/12/3 22:59:18]

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

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.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

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

标签:SOLSIGIGNSIGNsol币是什么币种SignatumREIGN币Signal Token

USDC热门资讯
SDT:杠杆代币福利来袭 - 30,000 USDT 总奖池等你瓜分!

尊敬的KuCoin用户,为感谢广大用户对KuCoin杠杆代币的支持,KuCoin杠杆代币特推出“杠杆代币福利来袭-30.

1900/1/1 0:00:00
PHA:关于alpha(Alpha Finance Lab)上线的通知

即日起,本站开通alpha(AlphaFinanceLab)充币提币并开启交易,请知悉。AlphaFinanceLab是一个跨链去中心化金融平台,其旨在币安智能链以及以太坊上建立建立一个为用户带.

1900/1/1 0:00:00
BIO:BioPower签订资产购买协议,收购部分与HyFi区块链技术相关的资产和4亿枚HyFi代币

据GlobeNewsWire消息,BioPowerOperationsCorporation今天宣布,已签订资产购买协议.

1900/1/1 0:00:00
BOX:Bibox DeFi机池挖矿活动(2021.7.6)

申购时间:2021年7月6日11:00~2021年7月6日18:00(UTC8)点击申购注意事项:本期挖矿周期为5天.

1900/1/1 0:00:00
区块链:KETP 是什么?新币投资价值分析

KETP由著名的计算机科学教授创立,利用其团队的突破性研究构建了世界上首屈一指的、安全第一的区块链,该区块链依赖于原生数字加密安全实用程序令牌KETP.

1900/1/1 0:00:00
DEFI:DeFi是一场货币和价值间的实验?

作者?|?LukePoseDeFi存在于广泛的创新和去中心化领域。DeFi所在的环境中,任何人都可以将他们的观点编入智能合约,因此实验在高风险的协调游戏中进行的实战测试.

1900/1/1 0:00:00