译文出自:登链翻译计划
译者:翻译小组
校对: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正确地指出了这一点。正确的方法是在本文底部的最后一个例子中。
Solana将在推出手机Saga的同时启动Solana dApp Store:金色财经报道,Solana将在推出Android系统手机Saga的同时启动Solana dApp Store,会在2023年1月开始接收Solana dApp Store提交(申请)。Solana dApp Store的用户应该会得到与任何其他应用商店提供的避免垃圾邮件、恶意应用程序以及非法内容等的保护。[2022/11/6 12:23:22]
DontUnderstandMeme
那么,这一切意味着什么呢?假设你熟悉公钥密码学的基本概念,这将很容易理解。
你可能知道,每当你向以太坊网络发送一笔交易时,必须用你的私钥签署这笔交易。自然也假设以太坊节点有某种方式来验证签名是正确的。
这种验证签名的功能也同样添加到了智能合约上。有了这个功能,你可以验证更多的东西,而不仅仅是交易签名本身。事实上,你可以将任何数据传递给智能合约,对其进行散列,然后根据数据验证其签名。上面的代码中的签名是v、r和s的组合。
为什么我需要这个?
实际上,之前也有文章讨论了如何使用它的例子。这些例子包括:
MetaTransactions
无需gas代币和ERC20-Permit还任重而道远
外媒:一开发者伪造11个假身份,Solana TVL疑似造假超70%:8月5日消息,据知情人士报道,Saber首席架构师IanMacalinao拥有11个假身份,其中包括Solana生态DeFi收益聚合器协议Sunny的开发者SuryaKhosla、Solana算法Stablecoin项目Cashio创始人0xGhostchain、多签钱包Goki创始人GokiRajesh等。得益于Ian Macalinao编写的TVL算法,数十亿美元资金在Solana的DeFi生态(至少包括Sunny和Saber)内被重复计算多次。而Ian Macalinao此前曾表示认为TVL的爆发式增长引发了SOL价格的暴涨。
目前,Ian Macalinao与同为Saber开发者的Dylan于6月底宣布将其创建的加密基金ShipCapital更名为Protagonist,据官网和监管文件显示该基金已筹集至少3300万美元,并已转向参与开发Aptos生态。据悉,该基金目前已参投的项目包括Aptos、可编程NFT初创公司Cardinal、neobankCogni、去中心化金融平台DeltaOne。(CoinDesk)[2022/8/5 12:03:50]
从本质上讲,你可以验证一个签名数据,而这些数据不一定来自交易签署者。
我应该使用哪个签名标准?
StandardsMeme
Solidus Labs完成1500万美元战略融资,Liberty City Ventures领投:11月5日消息,加密原生风险监控公司Solidus Labs今日宣布完成1500万美元战略融资,Liberty City Ventures领投,Exor Seeds和GSR参投。Solidus Labs于5月份完成2000万美元的A轮融资。Solidus Labs位于纽约,创立于2018年,在华盛顿特区、特拉维夫和伦敦设有办事处。其使命是通过量身定制的合规性和风险监控解决方案来实现安全和受监管的加密市场。(Businesswire)[2021/11/5 21:28:39]
首先,我们需要决定签名的类型。虽然这对ecrecover来说这并不重要,但对签名来说,已经有几个标准可以被客户端使用以太坊密钥来签署数据:
eth_sign
personal_sign
EIP-712
eth_sign是用来签署任意数据。这使得它是最强大的,最简单的,但也是最危险的。这里的大问题是,你可以让用户签署一个数据,而这个实际上是交易数据。想象一下,你让用户登录到你的服务,但你让他们签署的数据实际上是一个交易,如"发送5个ETH给攻击者"。交易毕竟只是由字节组成,人们很可能不会检查他们所签署的这串字符的实际含义。看似无害的签名,却成了窃取资金的攻击。所以一般不鼓励直接使用eth_sign。
加密市场监控公司SolidusLabs获2000万美元A轮融资:加密市场监控初创公司SolidusLabs宣布完成2000万美元A轮融资,EvolutionEquityPartners领投,其他投资方包括HanacoVentures(曾参与种子轮融资)、FTX、富达投资母公司FMRLLC旗下风险投资基金AvonVenture、前美国商品期货交易委员会(CFTC)主席ChristopherGiancarlo、前美国证券交易委员会(SEC)专员TroyParedes、前CFTC首席创新官DanielGorfine、合规软件解决方案提供商StarCompliance创始人MarcEpstein、国际证券交易所(ISE)创始人DavidKrell、AngelList创始人NavalRavikant等。[2021/5/25 22:41:31]
personal_sign后来加入来解决这个问题。该方法在任何签名数据前加上"EthereumSignedMessage:",这意味着如果有人要签署交易数据,添加的前缀字符串会使其成为无效交易。
对于更复杂的用例,特别是在智能合约中使用时,EIP-712标准被创建。EIP-712标准随着时间的推移而有所改变,但目前MetaMask支持的最后一个版本是signTypedData_v4。或者你可以使用一个特定的库,如eip-712。EIP-712解决的主要问题是确保用户清楚地知道他们在签署什么,为哪个合约地址和网络签署,而且每个签名最多只能使用一次。简而言之,这是通过签署所有需要的配置数据的哈希值实际数据本身来实现的。ERC20-Permit是一个关于如何使用signTypedData_v4的好例子。
动态 | 西班牙能源公司Repsol称区块链每年可帮其节省40万欧元:西班牙马德里能源公司Repsol报告了一项区块链试点的成功试验,据称区块链可以让Repsol每年减少错误的频率,节省高达400,000欧元。[2019/1/16]
所有的函数都可以在与MetaMask交互时使用,见例子。另外,它们也可以使用eth-sig-util。
所以回到问题我应该使用哪种签名标准?从合约的角度来看,使用最新的EIP-712标准!eth_sign并不安全,personal_sign主要用于实现用户登录功能。在你的合同中坚持使用EIP-712。
如何实现EIP-712
现在让我们看看如何在Solidity中实现EIP-712。大概的想法是:
计算一个域的哈希值,该值涵盖了合约地址和chainId的配置数据
计算结构化的数据哈希值
结合这两个哈希值,并在ecrecover中使用它。
我个人还建议增加一个nonce和deadline值,以防止重放攻击并确保在特定时间内执行。这些不是EIP-712标准的直接组成部分,但可以很容易地添加。下面你会发现一个例子,如何实现这些,然后加上合约的本身的参数去执行它:
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.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场
上一篇:
巨鲸的资金涌向哪里,哪里就是热点!
尊敬的用户:BKEXGlobal现已完成KUMAV2版本升级和置换智能合约地址,现已恢复KUMA的充值功能与提现功能.
1900/1/1 0:00:00尊敬的HCoin用户:大宗未释放份额兑换HCoin平台合约分红股权,第五十四期分红已经发放完毕.
1900/1/1 0:00:00随着越来越多的人了解加密货币,加密货币越来越受欢迎。同样,一些公司也开始将加密货币视为一种有效的交易或储值手段。人们难以想象没有加密货币的未来是怎样的,以下是一些专家对加密货币的看法.
1900/1/1 0:00:00本文由中币研究院原创编辑,下载全球领先的数字货币交易所中币APP:www.zb.land热点摘要:1.鲸鱼持有的比特币数量上升或表明市场已触底;2.世界上第一座中本聪的实体雕像将于9月16日在布.
1900/1/1 0:00:00头条以太坊伦敦硬分叉或将于8月4日在主网激活星球日报讯以太坊开发者TimBeiko表示,提议伦敦硬分叉于区块高度12965000在主网激活.
1900/1/1 0:00:00人们对于「隐私权」概念的萌芽最早始于12世纪,其含义从「什么是公平」扩展到包括「一种权利—一个人拥有的控制或主张某物的权利」,也许在战争时期,隐私通常被理解为「自由」,到了如今的互联网时期.
1900/1/1 0:00:00