以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads
首頁 > FTT > Info

SIGN:Solidity 中的 ecrecover 的應用

Author:

Time: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正確地指出了這一點。正確的方法是在本文底部的最后一個例子中。

Solend敦促某巨鯨盡快償還巨額貸款,以避免清算風險:6月19日消息,Solana生態借貸協議Solend創始人Rooter發推稱,某個巨鯨(3oSE開頭地址)在Solend上擁有價值1.7億美元的SOL存款和價值1.08億美元的USDC+USDT債務頭寸,清算價約為22.27美元。其SOL存款占Solend Main Pool的近95%,USDC債務占86%。

Rooter希望其盡快償還貸款,并且正在為最壞的情況做好準備。如果巨鯨被清算,它將以未償借款的20%(約2100萬美元)為上限進行部分清算。在Solend上大多數清算人都是使用DEX流動性的機器人,在DEX上這樣大規模的銷售或會進一步降低SOL價格,讓其他賬戶面臨清算。

Solend擁有2000萬美元的財庫資金,可以用于幫助償還壞賬,但是在最壞的情況下,可能資金仍不夠。目前Solend正在積極嘗試讓該巨鯨償還頭寸。

據悉,之后Solend已臨時禁用其Main Pool的USDC、USDT和SOL借款。[2022/6/19 4:38:39]

DontUnderstandMeme

那么,這一切意味著什么呢?假設你熟悉公鑰密碼學的基本概念,這將很容易理解。

你可能知道,每當你向以太坊網絡發送一筆交易時,必須用你的私鑰簽署這筆交易。自然也假設以太坊節點有某種方式來驗證簽名是正確的。

DeFi衍生品交易平臺Zeta Markets將在Solana主網上線:1月13日消息,Solana生態DeFi衍生品交易平臺Zeta Markets宣布將于美國東部時間1月17日9點(北京時間22點)在Solana主網上線。此外,Zeta還與加密衍生品做市商LedgerPrime和Pattern Research建立戰略合作伙伴關系,以確保平臺上所有交易的首日流動性。

據此前報道,基于Solana的DeFi期貨和期權交易所Zeta Markets宣布完成850萬美元的戰略輪融資,Jump Capital領投。[2022/1/13 8:46:28]

這種驗證簽名的功能也同樣添加到了智能合約上。有了這個功能,你可以驗證更多的東西,而不僅僅是交易簽名本身。事實上,你可以將任何數據傳遞給智能合約,對其進行散列,然后根據數據驗證其簽名。上面的代碼中的簽名是v、r和s的組合。

為什么我需要這個?

實際上,之前也有文章討論了如何使用它的例子。這些例子包括:

MetaTransactions

無需gas代幣和ERC20-Permit還任重而道遠

從本質上講,你可以驗證一個簽名數據,而這些數據不一定來自交易簽署者。

我應該使用哪個簽名標準?

StandardsMeme

RAHO將打造solana鏈上基于 Oracle 的 NFT 競技游戲:據官方消息,Radio-Hero 目前在Pinksale即將上線,RAHO上Solana鏈上基于 Oracle 的 NFT 競技游戲,Radio-Hero 包含Radio-Hero games、Metadata NFT 和Radio-Hero Metaverse對應了不同未來發展的分支。RAHO 采用DAO治理經濟模型實現GameFi+DAO融合。[2022/1/11 8:41:30]

首先,我們需要決定簽名的類型。雖然這對ecrecover來說這并不重要,但對簽名來說,已經有幾個標準可以被客戶端使用以太坊密鑰來簽署數據:

eth_sign

personal_sign

EIP-712

eth_sign是用來簽署任意數據。這使得它是最強大的,最簡單的,但也是最危險的。這里的大問題是,你可以讓用戶簽署一個數據,而這個實際上是交易數據。想象一下,你讓用戶登錄到你的服務,但你讓他們簽署的數據實際上是一個交易,如"發送5個ETH給攻擊者"。交易畢竟只是由字節組成,人們很可能不會檢查他們所簽署的這串字符的實際含義。看似無害的簽名,卻成了竊取資金的攻擊。所以一般不鼓勵直接使用eth_sign。

personal_sign后來加入來解決這個問題。該方法在任何簽名數據前加上"EthereumSignedMessage:",這意味著如果有人要簽署交易數據,添加的前綴字符串會使其成為無效交易。

Reddit聯合創始人與Solana Ventures合作推出5000萬美元Web3社交媒體專項基金:11月9日,Reddit聯合創始人Alexis Ohanian在里斯本Solana會議上宣布將與Solana Ventures合作,推出5000萬美元Web3社交媒體專項基金,助力Solana網絡上Web3社交媒體DApp的發展。[2021/11/9 6:41:53]

對于更復雜的用例,特別是在智能合約中使用時,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。

動態 | VanEck及SolidX未因SEC推遲決定而感到吃驚:據CoinDesk報道,美國證券交易委員會(SEC)上周推遲了對VanEck和SolidX的比特幣ETF提案做出決定的時間。VanEck數字資產戰略總監Gabor Gurbacs表示,此次延遲完全是在“預期”中的,他向CoinDesk重申該公司向市場推出“流動、保險及受到適當監管的物理比特幣ETF”的承諾仍然是堅決的。SolidX首席執行官 Dan Gallancy也表達了同樣的觀點,他也認為SEC上周四的決定對于他對提案的看法沒有影響。彭博資深ETF分析師Eric Balchunas也表示,他對批準幾率的預測沒有改變。在2018年底之前,比特幣ETF被批準的概率在5%到10%之間。[2018/9/27]

如何實現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.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場

上一篇:

巨鯨的資金涌向哪里,哪里就是熱點!

Tags:SOLSIGIGNSIGNAPT幣未來能超過SOL嗎SIGILIgnitionSignatum

FTT
NAM:ETH跌破2200美元

巴比特訊,根據歐易OKEx數據顯示,ETH跌破2200美元,現報2195美元,24H跌幅8.13%.

1900/1/1 0:00:00
COI:關于V2版本API調用規范公告

尊敬的KuCoin用戶:KuCoin已正式上線了V2版本的APIKEY,并且已停止對V1版本APIKEY的支持.

1900/1/1 0:00:00
Gate.io:Gate.io Startup首發DAO SHO項目 Pera Finance (PERA) 空投結果公告

1.關于首發項目PeraFinance(PERA)空投結果Gate.ioStartup首發項目PeraFinance代幣PERA于2021年07月6日18:00開始下單,16小時內下單同等對待.

1900/1/1 0:00:00
USD:關于對UNI5S等9個ETF產品進行份額合并的公告

尊敬的客戶: 由于當前部分ETF產品的單價均低于0.01USDT,為提高其價格變化的靈敏度,優化交易體驗,法拉第將在2021年7月7日20:00-22:00期間.

1900/1/1 0:00:00
ETH:如何在 imToken 體驗去中心化電子協議簽署平臺 EthSign?

什么是EthSign? EthSign是一個去中心化的電子協議簽署平臺,希望通過區塊鏈技術解決傳統電子簽名的痛點。用戶在使用傳統電子簽名時,必須獲得服務商的允許才能驗證簽名和檢索已經簽過的協議.

1900/1/1 0:00:00
SDN:關于支持Harmony(ONE)網絡升級的公告

親愛的用戶:幣安將于2021年07月07日22:00暫停ONE的充值、提現業務,以支持Harmony于網絡631出塊時期進行的網絡升級.

1900/1/1 0:00:00
ads