欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go-ethereum?解析ethersjs中產(chǎn)生的簽名信息思路詳解

 更新時(shí)間:2022年08月31日 10:10:45   作者:Shanshan?yuan  
這篇文章主要介紹了Go-ethereum?解析ethersjs中產(chǎn)生的簽名信息,我們解析簽名的需要知道,簽名的消息,簽名,和公鑰,按照這個(gè)思路,我們可以通過(guò)ethers實(shí)現(xiàn)消息的簽名,也可以通過(guò)go-ethereum實(shí)現(xià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)文章

最新評(píng)論