Go-ethereum?解析ethersjs中產(chǎn)生的簽名信息思路詳解
Go-ethereum 解析ethersjs中產(chǎn)生的簽名信息
在簽名驗證的過程中,我們判斷簽名正確的前提是,簽名解析后的公鑰,和發(fā)起這次動作的人是同一個公鑰。
我們解析簽名的需要知道,簽名的消息,簽名,和公鑰。
按照這個思路,我們可以通過ethers實現(xiàn)消息的簽名,也可以通過go-ethereum實現(xiàn)。
在簽名的解析過程中,通常是由前端將上述的的已知道信息發(fā)送到后端,后端然后針對信息進行解析工作。
后端的服務(wù)中可以使用node或者golang進行編寫。本文將講述這兩種解析形式。
1. ethers 消息簽名
Ethers 能夠通過簡單的編程語句實現(xiàn)Metamask對某個消息進行簽名
其實現(xiàn)的語句為:

import { ethers } from 'ethers'; // 導(dǎo)入ethers package
const provider = new ethers.providers.Web3Provider(window.ethereum);
console.log(provider) // 獲取provider,也就是rpc服務(wù)
// 請求訪問錢包
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 對“登錄網(wǎng)站進行簽名”
this.loginWithWeb3(this.userPk) // 其他業(yè)務(wù)模塊
console.log(signature) // 打印簽名1.1 ethers 對簽名消息進行解析

console.log("verifyMessage:",ethers.utils.verifyMessage("登錄網(wǎng)站" , signature))
簡單的一句語句就可以驗證簽名。
2. Golang 簽名解析
golang 中也可以針對簽名進行解析,原理和ethers中的verifyMessage 類似,但是在解析的過程中,需要轉(zhuǎn)化:因為簽名死按照EIP-191標(biāo)準(zhǔn),需要針對簽名的消息添加前綴:“\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
}
運行測試代碼驗證代碼的正確性
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)
}

驗證結(jié)果正確。
3. 總結(jié)
在golang 中針對簽名的解析需要考慮到簽名消息的前綴問題,否則不能夠正確將解析。
到此這篇關(guān)于Go-ethereum 解析ethersjs中產(chǎn)生的簽名信息的文章就介紹到這了,更多相關(guān)Go-ethereum簽名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go實現(xiàn)將任何網(wǎng)頁轉(zhuǎn)化為PDF
在許多應(yīng)用場景中,可能需要將網(wǎng)頁內(nèi)容轉(zhuǎn)化為?PDF?格式,使用Go編程語言,結(jié)合一些現(xiàn)有的庫,可以非常方便地實現(xiàn)這一功能,下面我們就來看看具體實現(xiàn)方法吧2024-11-11
goland 實現(xiàn)websocket server的示例代碼
本文主要介紹了goland 實現(xiàn)websocket server的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
golang?gorm框架數(shù)據(jù)庫的連接操作示例
這篇文章主要為大家介紹了golang?gorm框架數(shù)據(jù)庫操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04

