以下是用 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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复