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)文章
Golang語(yǔ)言實(shí)現(xiàn)gRPC的具體使用
本文主要介紹了Golang語(yǔ)言實(shí)現(xiàn)gRPC的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Windows下使用go語(yǔ)言寫程序安裝配置實(shí)例
這篇文章主要介紹了Windows下使用go語(yǔ)言寫程序安裝配置實(shí)例,本文講解了安裝go語(yǔ)言、寫go代碼、生成可執(zhí)行文件、批量生成可執(zhí)行文件等內(nèi)容,需要的朋友可以參考下2015-03-03
用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的分布式系統(tǒng)
這篇文章主要介紹了用Go語(yǔ)言編寫一個(gè)簡(jiǎn)單的分布式系統(tǒng),文中的代碼示例講解的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴跟著小編一起來(lái)看看吧2023-08-08
對(duì)Golang import 導(dǎo)入包語(yǔ)法詳解
今天小編就為大家分享一篇對(duì)Golang import 導(dǎo)入包語(yǔ)法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Go語(yǔ)言Zap庫(kù)Logger的定制化和封裝使用詳解
這篇文章主要介紹了Go語(yǔ)言Zap庫(kù)Logger的定制化和封裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Go實(shí)現(xiàn)將任何網(wǎng)頁(yè)轉(zhuǎn)化為PDF
在許多應(yīng)用場(chǎng)景中,可能需要將網(wǎng)頁(yè)內(nèi)容轉(zhuǎn)化為?PDF?格式,使用Go編程語(yǔ)言,結(jié)合一些現(xiàn)有的庫(kù),可以非常方便地實(shí)現(xiàn)這一功能,下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧2024-11-11
Go Web下gin框架的模板渲染的實(shí)現(xiàn)
Gin框架是目前非常流行的Go語(yǔ)言Web框架之一,作為一個(gè)輕量級(jí)的框架,Gin提供了豐富的功能和靈活的架構(gòu),本文就來(lái)介紹下Go Web下gin框架的模板渲染的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10
goland 實(shí)現(xiàn)websocket server的示例代碼
本文主要介紹了goland 實(shí)現(xiàn)websocket server的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
使用Golang實(shí)現(xiàn)AES加解密的代碼示例
在現(xiàn)代的數(shù)據(jù)安全中,加密和解密是極其重要的一環(huán),其中,高級(jí)加密標(biāo)準(zhǔn)(AES)是最廣泛使用的加密算法之一,本文將介紹如何使用Golang來(lái)實(shí)現(xiàn)AES加密和解密,需要的朋友可以參考下2024-04-04
golang?gorm框架數(shù)據(jù)庫(kù)的連接操作示例
這篇文章主要為大家介紹了golang?gorm框架數(shù)據(jù)庫(kù)操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04

