我是靠谱客的博主 岁月静好,最近开发中收集的这篇文章主要介绍用golang实现以太坊EIP-712 的签名和解签的代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

以下是用 Go 实现 EIP-712 的签名和验证签名的代码示例:

package main

import (
	"encoding/hex"
	"encoding/json"
	"fmt"

	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/crypto"
)

// Struct representing the typed data for signing
type TypedData struct {
	Types       map[string][]Type `json:"types"`
	PrimaryType string            `json:"primaryType"`
	Domain      Domain            `json:"domain"`
	Message     interface{}       `json:"message"`
}

type Type struct {
	Name string `json:"name"`
	Type string `json:"type"`
}

type Domain struct {
	Name              string `json:"name"`
	Version           string `json:"version"`
	ChainId           uint   `json:"chainId"`
	VerifyingContract string `json:"verifyingContract"`
	Salt              string `json:"salt,omitempty"`
}

func main() {
	// Example typed data
	typedData := TypedData{
		Types: map[string][]Type{
			"EIP712Domain": {
				{"name", "string"},
				{"version", "string"},
				{"chainId", "uint"},
				{"verifyingContract", "address"},
			},
			"Person": {
				{"name", "string"},
				{"wallet", "address"},
			},
		},
		PrimaryType: "Person",
		Domain: Domain{
			Name:              "Example",
			Version:           "1",
			ChainId:           1,
			VerifyingContract: "0x0000000000000000000000000000000000000000", // Address of verifying contract
		},
		Message: map[string]interface{}{
			"name":   "Bob",
			"wallet": "0x1234567890123456789012345678901234567890", // Address of person
		},
	}

	// Sign typed data
	signature, err := SignTypedData(typedData, "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")
	if err != nil {
		fmt.Println("Error signing data:", err)
		return
	}

	fmt.Println("Signature:", signature)

	// Verify signature
	address, err := VerifyTypedData(typedData, signature)
	if err != nil {
		fmt.Println("Error verifying signature:", err)
		return
	}

	fmt.Println("Address:", address)
}

// SignTypedData signs the given typed data with the provided private key
func SignTypedData(typedData TypedData, privateKeyHex string) (string, error) {
	typedDataBytes, err := json.Marshal(typedData)
	if err != nil {
		return "", err
	}

	hash := crypto.Keccak256Hash(typedDataBytes)
	privateKey, err := crypto.HexToECDSA(privateKeyHex)
	if err != nil {
		return "", err
	}

	signature, err := crypto.Sign(hash.Bytes(), privateKey)
	if err != nil {
		return "", err
	}

	return hex.EncodeToString(signature), nil
}

// VerifyTypedData verifies the given typed data signature
func VerifyTypedData(typedData TypedData, signatureHex string) (common.Address, error) {
	typedDataBytes, err := json.Marshal(typedData)
	if err != nil {
		return common.Address{}, err
	}

	hash := crypto.Keccak256Hash(typedDataBytes)
	signature, err := hex.DecodeString(signatureHex)
	if err != nil {
		return common.Address{}, err
	}

	sigPublicKey, err := crypto.Ecrecover(hash.Bytes(), signature)
	if err != nil {
		return common.Address{}, err
	}

	publicKeyECDSA, err := crypto.SigToPub(hash.Bytes(), signature)
	if err != nil {
		return common.Address{}, err
	}

	address := crypto.PubkeyToAddress(*publicKeyECDSA)
	return address, nil
}

这个示例代码演示了如何使用 Go 语言来对 EIP-712 结构化数据进行签名和验证签名。您需要替换示例中的 verifyingContract 地址和私钥为实际值。

最后

以上就是岁月静好为你收集整理的用golang实现以太坊EIP-712 的签名和解签的代码的全部内容,希望文章能够帮你解决用golang实现以太坊EIP-712 的签名和解签的代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(144)

评论列表共有 0 条评论

立即
投稿
返回
顶部