Go-ethereum?解析ethersjs中產(chǎn)生的簽名信息思路詳解
Go-ethereum 解析ethersjs中產(chǎn)生的簽名信息
在簽名驗(yàn)證的過(guò)程中,我們判斷簽名正確的前提是,簽名解析后的公鑰,和發(fā)起這次動(dòng)作的人是同一個(gè)公鑰。
我們解析簽名的需要知道,簽名的消息,簽名,和公鑰。
按照這個(gè)思路,我們可以通過(guò)ethers實(shí)現(xiàn)消息的簽名,也可以通過(guò)go-ethereum實(shí)現(xiàn)。
在簽名的解析過(guò)程中,通常是由前端將上述的的已知道信息發(fā)送到后端,后端然后針對(duì)信息進(jìn)行解析工作。
后端的服務(wù)中可以使用node或者golang進(jìn)行編寫。本文將講述這兩種解析形式。
1. ethers 消息簽名
Ethers 能夠通過(guò)簡(jiǎn)單的編程語(yǔ)句實(shí)現(xiàn)Metamask對(duì)某個(gè)消息進(jìn)行簽名
其實(shí)現(xiàn)的語(yǔ)句為:
import { ethers } from 'ethers'; // 導(dǎo)入ethers package const provider = new ethers.providers.Web3Provider(window.ethereum); console.log(provider) // 獲取provider,也就是rpc服務(wù) // 請(qǐng)求訪問(wèn)錢包 await provider.send("eth_requestAccounts", []) const signer = provider.getSigner(); //獲取簽名者信息 this.userPk = await signer.getAddress(); // 獲取簽名者公鑰 console.log(this.userPk) let signature = await signer.signMessage("登錄網(wǎng)站") // metamask 對(duì)“登錄網(wǎng)站進(jìn)行簽名” this.loginWithWeb3(this.userPk) // 其他業(yè)務(wù)模塊 console.log(signature) // 打印簽名
1.1 ethers 對(duì)簽名消息進(jìn)行解析
console.log("verifyMessage:",ethers.utils.verifyMessage("登錄網(wǎng)站" , signature))
簡(jiǎn)單的一句語(yǔ)句就可以驗(yàn)證簽名。
2. Golang 簽名解析
golang 中也可以針對(duì)簽名進(jìn)行解析,原理和ethers中的verifyMessage 類似,但是在解析的過(guò)程中,需要轉(zhuǎn)化:因?yàn)楹灻腊凑誆IP-191標(biāo)準(zhǔn),需要針對(duì)簽名的消息添加前綴:“\x19Ethereum Signed Message:\n”
以下是完整的代碼,其中的參數(shù)全部為string類型,返回簽名中的公鑰。
func VerifyMessage(ctx context.Context, message string, signedMessage string) (string, error) { // Hash the unsigned message using EIP-191 hashedMessage := []byte("\x19Ethereum Signed Message:\n" + strconv.Itoa(len(message)) + message) hash := crypto.Keccak256Hash(hashedMessage) // Get the bytes of the signed message decodedMessage := hexutil.MustDecode(signedMessage) // Handles cases where EIP-115 is not implemented (most wallets don't implement it) if decodedMessage[64] == 27 || decodedMessage[64] == 28 { decodedMessage[64] -= 27 } // Recover a public key from the signed message sigPublicKeyECDSA, err := crypto.SigToPub(hash.Bytes(), decodedMessage) if sigPublicKeyECDSA == nil { err = errors.New("Could not get a public get from the message signature") } if err != nil { return "", err } return crypto.PubkeyToAddress(*sigPublicKeyECDSA).String(), nil }
運(yùn)行測(cè)試代碼驗(yàn)證代碼的正確性
func TestVerifySignature(t *testing.T) { var signature Signature initdata := "登錄網(wǎng)站" sign := "0x5321f24a057500605f1d894c2be7cb7f196ba2444e8f6815af261efbcb9d272f70d327f146553c3d51cf1816823dba6254d5500a69b4197e9f4839e0971cf89d1b" publicKey := "0x0bDCC0C6eAc88439fb57b90977714b7430c3c623" publicKey2, err := signature.VerifyMessage(context.Background(), initdata, sign) fmt.Println(publicKey == publicKey2, err) }
驗(yàn)證結(jié)果正確。
3. 總結(jié)
在golang 中針對(duì)簽名的解析需要考慮到簽名消息的前綴問(wèn)題,否則不能夠正確將解析。
到此這篇關(guān)于Go-ethereum 解析ethersjs中產(chǎn)生的簽名信息的文章就介紹到這了,更多相關(guān)Go-ethereum簽名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go檢查結(jié)構(gòu)體中是否存在某個(gè)字段及創(chuàng)建結(jié)構(gòu)體切片或映射
這篇文章主要為大家介紹了Go檢查結(jié)構(gòu)體中是否存在某個(gè)字段及創(chuàng)建結(jié)構(gòu)體切片或映射實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Go計(jì)算某段代碼運(yùn)行所耗時(shí)間簡(jiǎn)單實(shí)例
這篇文章主要給大家介紹了關(guān)于Go計(jì)算某段代碼運(yùn)行所耗時(shí)間的相關(guān)資料,主要介紹了Golang記錄計(jì)算函數(shù)執(zhí)行耗時(shí)、運(yùn)行時(shí)間的一個(gè)簡(jiǎn)單方法,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-11-11golang遍歷時(shí)修改被遍歷對(duì)象的示例詳解
這篇文章主要介紹了golang遍歷時(shí)修改被遍歷對(duì)象的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01詳解Go并發(fā)編程時(shí)如何避免發(fā)生競(jìng)態(tài)條件和數(shù)據(jù)競(jìng)爭(zhēng)
大家都知道,Go是一種支持并發(fā)編程的編程語(yǔ)言,但并發(fā)編程也是比較復(fù)雜和容易出錯(cuò)的。比如本篇分享的問(wèn)題:競(jìng)態(tài)條件和數(shù)據(jù)競(jìng)爭(zhēng)的問(wèn)題2023-04-04Go實(shí)現(xiàn)整合Logrus實(shí)現(xiàn)日志打印
這篇文章主要介紹了Go實(shí)現(xiàn)整合Logrus實(shí)現(xiàn)日志打印,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07Go 實(shí)現(xiàn)基于Token 的登錄流程深度分析
Token 認(rèn)證機(jī)制的核心思想是,服務(wù)端在用戶登錄時(shí)生成一個(gè) Token,客戶端在后續(xù)的請(qǐng)求中攜帶這個(gè) Token,服務(wù)端通過(guò)驗(yàn)證 Token 的有效性來(lái)確認(rèn)用戶的身份,本文將帶你深入探索基于 Token 的登錄流程,這是一種更為靈活且適用于現(xiàn)代應(yīng)用架構(gòu)的認(rèn)證方式2024-03-03go代碼實(shí)現(xiàn)買房貸款月供計(jì)算的方法
今天小編就為大家分享一篇關(guān)于go代碼實(shí)現(xiàn)買房貸款月供計(jì)算的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04golang如何使用gomobile進(jìn)行Android開(kāi)發(fā)
golang可以開(kāi)發(fā)android,使用golang開(kāi)發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關(guān)于golang如何使用gomobile進(jìn)行Android開(kāi)發(fā)的相關(guān)資料,需要的朋友可以參考下2023-01-01go語(yǔ)言優(yōu)雅地處理error工具及技巧詳解
這篇文章主要為大家介紹了go語(yǔ)言優(yōu)雅地處理error工具及技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11