mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-27 00:35:18 +00:00
add vrf
This commit is contained in:
parent
d2fb2f6e82
commit
4acb96258f
@ -7,12 +7,13 @@ import (
|
|||||||
svrcmd "github.com/cosmos/cosmos-sdk/server/cmd"
|
svrcmd "github.com/cosmos/cosmos-sdk/server/cmd"
|
||||||
|
|
||||||
"github.com/0glabs/0g-chain/app"
|
"github.com/0glabs/0g-chain/app"
|
||||||
|
"github.com/0glabs/0g-chain/chaincfg"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rootCmd := NewRootCmd()
|
rootCmd := NewRootCmd()
|
||||||
|
|
||||||
if err := svrcmd.Execute(rootCmd, EnvPrefix, app.DefaultNodeHome); err != nil {
|
if err := svrcmd.Execute(rootCmd, chaincfg.EnvPrefix, app.DefaultNodeHome); err != nil {
|
||||||
switch e := err.(type) {
|
switch e := err.(type) {
|
||||||
case server.ErrorCode:
|
case server.ErrorCode:
|
||||||
os.Exit(e.Code)
|
os.Exit(e.Code)
|
||||||
|
@ -14,7 +14,7 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/0glabs/0g-chain/cmd/kava/opendb"
|
"github.com/0glabs/0g-chain/cmd/opendb"
|
||||||
"github.com/cosmos/cosmos-sdk/client"
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
"github.com/cosmos/cosmos-sdk/server"
|
||||||
"github.com/linxGnu/grocksdb"
|
"github.com/linxGnu/grocksdb"
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
"github.com/cosmos/cosmos-sdk/client/config"
|
"github.com/cosmos/cosmos-sdk/client/config"
|
||||||
"github.com/cosmos/cosmos-sdk/client/debug"
|
"github.com/cosmos/cosmos-sdk/client/debug"
|
||||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||||
|
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||||
"github.com/cosmos/cosmos-sdk/server"
|
"github.com/cosmos/cosmos-sdk/server"
|
||||||
|
|
||||||
tmcfg "github.com/cometbft/cometbft/config"
|
tmcfg "github.com/cometbft/cometbft/config"
|
||||||
@ -25,19 +26,22 @@ import (
|
|||||||
|
|
||||||
"github.com/0glabs/0g-chain/app"
|
"github.com/0glabs/0g-chain/app"
|
||||||
"github.com/0glabs/0g-chain/app/params"
|
"github.com/0glabs/0g-chain/app/params"
|
||||||
|
"github.com/0glabs/0g-chain/chaincfg"
|
||||||
"github.com/0glabs/0g-chain/cmd/0gchaind/rocksdb"
|
"github.com/0glabs/0g-chain/cmd/0gchaind/rocksdb"
|
||||||
"github.com/0glabs/0g-chain/cmd/opendb"
|
"github.com/0glabs/0g-chain/cmd/opendb"
|
||||||
|
"github.com/0glabs/0g-chain/crypto/vrf"
|
||||||
)
|
)
|
||||||
|
|
||||||
// EnvPrefix is the prefix environment variables must have to configure the app.
|
func customKeyringOptions() keyring.Option {
|
||||||
const EnvPrefix = "KAVA"
|
return func(options *keyring.Options) {
|
||||||
|
options.SupportedAlgos = append(hd.SupportedAlgorithms, vrf.VrfAlgo)
|
||||||
|
options.SupportedAlgosLedger = append(hd.SupportedAlgorithmsLedger, vrf.VrfAlgo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewRootCmd creates a new root command for the kava blockchain.
|
// NewRootCmd creates a new root command for the 0g-chain blockchain.
|
||||||
func NewRootCmd() *cobra.Command {
|
func NewRootCmd() *cobra.Command {
|
||||||
app.SetSDKConfig().Seal()
|
|
||||||
|
|
||||||
encodingConfig := app.MakeEncodingConfig()
|
encodingConfig := app.MakeEncodingConfig()
|
||||||
|
|
||||||
initClientCtx := client.Context{}.
|
initClientCtx := client.Context{}.
|
||||||
WithCodec(encodingConfig.Marshaler).
|
WithCodec(encodingConfig.Marshaler).
|
||||||
WithInterfaceRegistry(encodingConfig.InterfaceRegistry).
|
WithInterfaceRegistry(encodingConfig.InterfaceRegistry).
|
||||||
@ -46,13 +50,13 @@ func NewRootCmd() *cobra.Command {
|
|||||||
WithInput(os.Stdin).
|
WithInput(os.Stdin).
|
||||||
WithAccountRetriever(types.AccountRetriever{}).
|
WithAccountRetriever(types.AccountRetriever{}).
|
||||||
WithBroadcastMode(flags.FlagBroadcastMode).
|
WithBroadcastMode(flags.FlagBroadcastMode).
|
||||||
WithHomeDir(app.DefaultNodeHome).
|
WithHomeDir(chaincfg.DefaultNodeHome).
|
||||||
WithKeyringOptions(hd.EthSecp256k1Option()).
|
WithKeyringOptions(customKeyringOptions()).
|
||||||
WithViper(EnvPrefix)
|
WithViper(chaincfg.EnvPrefix)
|
||||||
|
|
||||||
rootCmd := &cobra.Command{
|
rootCmd := &cobra.Command{
|
||||||
Use: "kava",
|
Use: chaincfg.AppName,
|
||||||
Short: "Daemon and CLI for the Kava blockchain.",
|
Short: "Daemon and CLI for the 0g-chain blockchain.",
|
||||||
PersistentPreRunE: func(cmd *cobra.Command, _ []string) error {
|
PersistentPreRunE: func(cmd *cobra.Command, _ []string) error {
|
||||||
cmd.SetOut(cmd.OutOrStdout())
|
cmd.SetOut(cmd.OutOrStdout())
|
||||||
cmd.SetErr(cmd.ErrOrStderr())
|
cmd.SetErr(cmd.ErrOrStderr())
|
||||||
@ -71,7 +75,7 @@ func NewRootCmd() *cobra.Command {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
customAppTemplate, customAppConfig := servercfg.AppConfig("ukava")
|
customAppTemplate, customAppConfig := servercfg.AppConfig(chaincfg.BaseDenom)
|
||||||
|
|
||||||
return server.InterceptConfigsPreRunHandler(
|
return server.InterceptConfigsPreRunHandler(
|
||||||
cmd,
|
cmd,
|
||||||
@ -82,12 +86,12 @@ func NewRootCmd() *cobra.Command {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
addSubCmds(rootCmd, encodingConfig, app.DefaultNodeHome)
|
addSubCmds(rootCmd, encodingConfig, chaincfg.DefaultNodeHome)
|
||||||
|
|
||||||
return rootCmd
|
return rootCmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// addSubCmds registers all the sub commands used by kava.
|
// addSubCmds registers all the sub commands used by 0g-chain.
|
||||||
func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, defaultNodeHome string) {
|
func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, defaultNodeHome string) {
|
||||||
gentxModule, ok := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic)
|
gentxModule, ok := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic)
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -116,7 +120,7 @@ func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, de
|
|||||||
|
|
||||||
opts := ethermintserver.StartOptions{
|
opts := ethermintserver.StartOptions{
|
||||||
AppCreator: ac.newApp,
|
AppCreator: ac.newApp,
|
||||||
DefaultNodeHome: app.DefaultNodeHome,
|
DefaultNodeHome: chaincfg.DefaultNodeHome,
|
||||||
DBOpener: opendb.OpenDB,
|
DBOpener: opendb.OpenDB,
|
||||||
}
|
}
|
||||||
// ethermintserver adds additional flags to start the JSON-RPC server for evm support
|
// ethermintserver adds additional flags to start the JSON-RPC server for evm support
|
||||||
@ -131,7 +135,7 @@ func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, de
|
|||||||
rootCmd.AddCommand(
|
rootCmd.AddCommand(
|
||||||
newQueryCmd(),
|
newQueryCmd(),
|
||||||
newTxCmd(),
|
newTxCmd(),
|
||||||
keyCommands(app.DefaultNodeHome),
|
keyCommands(chaincfg.DefaultNodeHome),
|
||||||
rocksdb.RocksDBCmd,
|
rocksdb.RocksDBCmd,
|
||||||
newShardCmd(opts),
|
newShardCmd(opts),
|
||||||
)
|
)
|
||||||
|
58
crypto/vrf/algorithm.go
Normal file
58
crypto/vrf/algorithm.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package vrf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||||
|
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||||
|
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// SupportedAlgorithms defines the list of signing algorithms used on Evmos:
|
||||||
|
// - eth_secp256k1 (Ethereum)
|
||||||
|
// - secp256k1 (Tendermint)
|
||||||
|
SupportedAlgorithms = keyring.SigningAlgoList{VrfAlgo}
|
||||||
|
// SupportedAlgorithmsLedger defines the list of signing algorithms used on Evmos for the Ledger device:
|
||||||
|
// - eth_secp256k1 (Ethereum)
|
||||||
|
// - secp256k1 (Tendermint)
|
||||||
|
SupportedAlgorithmsLedger = keyring.SigningAlgoList{VrfAlgo}
|
||||||
|
)
|
||||||
|
|
||||||
|
func VrfOption() keyring.Option {
|
||||||
|
return func(options *keyring.Options) {
|
||||||
|
options.SupportedAlgos = SupportedAlgorithms
|
||||||
|
options.SupportedAlgosLedger = SupportedAlgorithmsLedger
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
VrfType = hd.PubKeyType(KeyType)
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ keyring.SignatureAlgo = VrfAlgo
|
||||||
|
VrfAlgo = vrfAlgo{}
|
||||||
|
)
|
||||||
|
|
||||||
|
type vrfAlgo struct{}
|
||||||
|
|
||||||
|
func (s vrfAlgo) Name() hd.PubKeyType {
|
||||||
|
return VrfType
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s vrfAlgo) Derive() hd.DeriveFn {
|
||||||
|
return func(mnemonic, bip39Passphrase, path string) ([]byte, error) {
|
||||||
|
key, err := GenerateKey()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return key.Bytes(), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s vrfAlgo) Generate() hd.GenerateFn {
|
||||||
|
return func(bz []byte) cryptotypes.PrivKey {
|
||||||
|
key, _ := GenerateKey()
|
||||||
|
return key
|
||||||
|
}
|
||||||
|
}
|
496
crypto/vrf/keys.pb.go
Normal file
496
crypto/vrf/keys.pb.go
Normal file
@ -0,0 +1,496 @@
|
|||||||
|
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
||||||
|
// source: crypto/vrf/keys.proto
|
||||||
|
|
||||||
|
package vrf
|
||||||
|
|
||||||
|
import (
|
||||||
|
fmt "fmt"
|
||||||
|
_ "github.com/cosmos/gogoproto/gogoproto"
|
||||||
|
proto "github.com/cosmos/gogoproto/proto"
|
||||||
|
io "io"
|
||||||
|
math "math"
|
||||||
|
math_bits "math/bits"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
|
// PubKey defines a type alias for an vrf.PublicKey that implements
|
||||||
|
// Vrf's PubKey interface. It represents the 32-byte compressed public
|
||||||
|
// key format.
|
||||||
|
type PubKey struct {
|
||||||
|
// key is the public key in byte form
|
||||||
|
Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PubKey) Reset() { *m = PubKey{} }
|
||||||
|
func (*PubKey) ProtoMessage() {}
|
||||||
|
func (*PubKey) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_eae59d1af27f5957, []int{0}
|
||||||
|
}
|
||||||
|
func (m *PubKey) XXX_Unmarshal(b []byte) error {
|
||||||
|
return m.Unmarshal(b)
|
||||||
|
}
|
||||||
|
func (m *PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
if deterministic {
|
||||||
|
return xxx_messageInfo_PubKey.Marshal(b, m, deterministic)
|
||||||
|
} else {
|
||||||
|
b = b[:cap(b)]
|
||||||
|
n, err := m.MarshalToSizedBuffer(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return b[:n], nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (m *PubKey) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_PubKey.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *PubKey) XXX_Size() int {
|
||||||
|
return m.Size()
|
||||||
|
}
|
||||||
|
func (m *PubKey) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_PubKey.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_PubKey proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *PubKey) GetKey() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.Key
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PrivKey defines a type alias for an vrf.PrivateKey that implements
|
||||||
|
// Vrf's PrivateKey interface.
|
||||||
|
type PrivKey struct {
|
||||||
|
// key is the private key in byte form
|
||||||
|
Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PrivKey) Reset() { *m = PrivKey{} }
|
||||||
|
func (m *PrivKey) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*PrivKey) ProtoMessage() {}
|
||||||
|
func (*PrivKey) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_eae59d1af27f5957, []int{1}
|
||||||
|
}
|
||||||
|
func (m *PrivKey) XXX_Unmarshal(b []byte) error {
|
||||||
|
return m.Unmarshal(b)
|
||||||
|
}
|
||||||
|
func (m *PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
if deterministic {
|
||||||
|
return xxx_messageInfo_PrivKey.Marshal(b, m, deterministic)
|
||||||
|
} else {
|
||||||
|
b = b[:cap(b)]
|
||||||
|
n, err := m.MarshalToSizedBuffer(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return b[:n], nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (m *PrivKey) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_PrivKey.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *PrivKey) XXX_Size() int {
|
||||||
|
return m.Size()
|
||||||
|
}
|
||||||
|
func (m *PrivKey) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_PrivKey.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_PrivKey proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *PrivKey) GetKey() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.Key
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*PubKey)(nil), "crypto.vrf.PubKey")
|
||||||
|
proto.RegisterType((*PrivKey)(nil), "crypto.vrf.PrivKey")
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("crypto/vrf/keys.proto", fileDescriptor_eae59d1af27f5957) }
|
||||||
|
|
||||||
|
var fileDescriptor_eae59d1af27f5957 = []byte{
|
||||||
|
// 174 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4d, 0x2e, 0xaa, 0x2c,
|
||||||
|
0x28, 0xc9, 0xd7, 0x2f, 0x2b, 0x4a, 0xd3, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f,
|
||||||
|
0xc9, 0x17, 0xe2, 0x82, 0x08, 0xeb, 0x95, 0x15, 0xa5, 0x49, 0x89, 0xa4, 0xe7, 0xa7, 0xe7, 0x83,
|
||||||
|
0x85, 0xf5, 0x41, 0x2c, 0x88, 0x0a, 0x25, 0x05, 0x2e, 0xb6, 0x80, 0xd2, 0x24, 0xef, 0xd4, 0x4a,
|
||||||
|
0x21, 0x01, 0x2e, 0xe6, 0xec, 0xd4, 0x4a, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x9e, 0x20, 0x10, 0xd3,
|
||||||
|
0x8a, 0x65, 0xc6, 0x02, 0x79, 0x06, 0x25, 0x69, 0x2e, 0xf6, 0x80, 0xa2, 0xcc, 0x32, 0xac, 0x4a,
|
||||||
|
0x9c, 0xec, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09,
|
||||||
|
0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x35, 0x3d, 0xb3,
|
||||||
|
0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0xdf, 0x20, 0x3d, 0x27, 0x31, 0xa9, 0x58, 0xdf,
|
||||||
|
0x20, 0x5d, 0x37, 0x39, 0x23, 0x31, 0x33, 0x4f, 0x1f, 0xe1, 0xd8, 0x24, 0x36, 0xb0, 0x33, 0x8c,
|
||||||
|
0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xb8, 0x32, 0x07, 0xc1, 0x00, 0x00, 0x00,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PubKey) Marshal() (dAtA []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
dAtA = make([]byte, size)
|
||||||
|
n, err := m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dAtA[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PubKey) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
size := m.Size()
|
||||||
|
return m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||||
|
i := len(dAtA)
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.Key) > 0 {
|
||||||
|
i -= len(m.Key)
|
||||||
|
copy(dAtA[i:], m.Key)
|
||||||
|
i = encodeVarintKeys(dAtA, i, uint64(len(m.Key)))
|
||||||
|
i--
|
||||||
|
dAtA[i] = 0xa
|
||||||
|
}
|
||||||
|
return len(dAtA) - i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PrivKey) Marshal() (dAtA []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
dAtA = make([]byte, size)
|
||||||
|
n, err := m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dAtA[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PrivKey) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
size := m.Size()
|
||||||
|
return m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||||
|
i := len(dAtA)
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
if len(m.Key) > 0 {
|
||||||
|
i -= len(m.Key)
|
||||||
|
copy(dAtA[i:], m.Key)
|
||||||
|
i = encodeVarintKeys(dAtA, i, uint64(len(m.Key)))
|
||||||
|
i--
|
||||||
|
dAtA[i] = 0xa
|
||||||
|
}
|
||||||
|
return len(dAtA) - i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeVarintKeys(dAtA []byte, offset int, v uint64) int {
|
||||||
|
offset -= sovKeys(v)
|
||||||
|
base := offset
|
||||||
|
for v >= 1<<7 {
|
||||||
|
dAtA[offset] = uint8(v&0x7f | 0x80)
|
||||||
|
v >>= 7
|
||||||
|
offset++
|
||||||
|
}
|
||||||
|
dAtA[offset] = uint8(v)
|
||||||
|
return base
|
||||||
|
}
|
||||||
|
func (m *PubKey) Size() (n int) {
|
||||||
|
if m == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
l = len(m.Key)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovKeys(uint64(l))
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *PrivKey) Size() (n int) {
|
||||||
|
if m == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
l = len(m.Key)
|
||||||
|
if l > 0 {
|
||||||
|
n += 1 + l + sovKeys(uint64(l))
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func sovKeys(x uint64) (n int) {
|
||||||
|
return (math_bits.Len64(x|1) + 6) / 7
|
||||||
|
}
|
||||||
|
func sozKeys(x uint64) (n int) {
|
||||||
|
return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
||||||
|
}
|
||||||
|
func (m *PubKey) Unmarshal(dAtA []byte) error {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
preIndex := iNdEx
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowKeys
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= uint64(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
if wireType == 4 {
|
||||||
|
return fmt.Errorf("proto: PubKey: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: PubKey: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
|
||||||
|
}
|
||||||
|
var byteLen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowKeys
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
byteLen |= int(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if byteLen < 0 {
|
||||||
|
return ErrInvalidLengthKeys
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + byteLen
|
||||||
|
if postIndex < 0 {
|
||||||
|
return ErrInvalidLengthKeys
|
||||||
|
}
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...)
|
||||||
|
if m.Key == nil {
|
||||||
|
m.Key = []byte{}
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipKeys(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if (skippy < 0) || (iNdEx+skippy) < 0 {
|
||||||
|
return ErrInvalidLengthKeys
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (m *PrivKey) Unmarshal(dAtA []byte) error {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
preIndex := iNdEx
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowKeys
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= uint64(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
if wireType == 4 {
|
||||||
|
return fmt.Errorf("proto: PrivKey: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: PrivKey: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
case 1:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
|
||||||
|
}
|
||||||
|
var byteLen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowKeys
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
byteLen |= int(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if byteLen < 0 {
|
||||||
|
return ErrInvalidLengthKeys
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + byteLen
|
||||||
|
if postIndex < 0 {
|
||||||
|
return ErrInvalidLengthKeys
|
||||||
|
}
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...)
|
||||||
|
if m.Key == nil {
|
||||||
|
m.Key = []byte{}
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipKeys(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if (skippy < 0) || (iNdEx+skippy) < 0 {
|
||||||
|
return ErrInvalidLengthKeys
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func skipKeys(dAtA []byte) (n int, err error) {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
depth := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowKeys
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
switch wireType {
|
||||||
|
case 0:
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowKeys
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx++
|
||||||
|
if dAtA[iNdEx-1] < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
iNdEx += 8
|
||||||
|
case 2:
|
||||||
|
var length int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowKeys
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
length |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if length < 0 {
|
||||||
|
return 0, ErrInvalidLengthKeys
|
||||||
|
}
|
||||||
|
iNdEx += length
|
||||||
|
case 3:
|
||||||
|
depth++
|
||||||
|
case 4:
|
||||||
|
if depth == 0 {
|
||||||
|
return 0, ErrUnexpectedEndOfGroupKeys
|
||||||
|
}
|
||||||
|
depth--
|
||||||
|
case 5:
|
||||||
|
iNdEx += 4
|
||||||
|
default:
|
||||||
|
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
||||||
|
}
|
||||||
|
if iNdEx < 0 {
|
||||||
|
return 0, ErrInvalidLengthKeys
|
||||||
|
}
|
||||||
|
if depth == 0 {
|
||||||
|
return iNdEx, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrInvalidLengthKeys = fmt.Errorf("proto: negative length found during unmarshaling")
|
||||||
|
ErrIntOverflowKeys = fmt.Errorf("proto: integer overflow")
|
||||||
|
ErrUnexpectedEndOfGroupKeys = fmt.Errorf("proto: unexpected end of group")
|
||||||
|
)
|
194
crypto/vrf/vrf.go
Normal file
194
crypto/vrf/vrf.go
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
package vrf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/subtle"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
errorsmod "cosmossdk.io/errors"
|
||||||
|
tmcrypto "github.com/cometbft/cometbft/crypto"
|
||||||
|
vrfalgo "github.com/coniks-sys/coniks-go/crypto/vrf"
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
|
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||||
|
errortypes "github.com/cosmos/cosmos-sdk/types/errors"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// PrivKeySize defines the size of the PrivKey bytes
|
||||||
|
PrivKeySize = 64
|
||||||
|
// PubKeySize defines the size of the PubKey bytes
|
||||||
|
PubKeySize = 32
|
||||||
|
// KeyType is the string constant for the vrf algorithm
|
||||||
|
KeyType = "vrf"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Amino encoding names
|
||||||
|
const (
|
||||||
|
// PrivKeyName defines the amino encoding name for the vrf private key
|
||||||
|
PrivKeyName = "vrf/PrivKey"
|
||||||
|
// PubKeyName defines the amino encoding name for the vrf public key
|
||||||
|
PubKeyName = "vrf/PubKey"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// vrf Private Key
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ cryptotypes.PrivKey = &PrivKey{}
|
||||||
|
_ codec.AminoMarshaler = &PrivKey{}
|
||||||
|
)
|
||||||
|
|
||||||
|
// GenerateKey generates a new random private key. It returns an error upon
|
||||||
|
// failure.
|
||||||
|
func GenerateKey() (*PrivKey, error) {
|
||||||
|
priv, err := vrfalgo.GenerateKey(nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &PrivKey{
|
||||||
|
Key: priv,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (privKey PrivKey) getVrfPrivateKey() vrfalgo.PrivateKey {
|
||||||
|
return vrfalgo.PrivateKey(privKey.Key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bytes returns the byte representation of the Private Key.
|
||||||
|
func (privKey PrivKey) Bytes() []byte {
|
||||||
|
bz := make([]byte, len(privKey.Key))
|
||||||
|
copy(bz, privKey.Key)
|
||||||
|
|
||||||
|
return bz
|
||||||
|
}
|
||||||
|
|
||||||
|
// PubKey returns the private key's public key. If the privkey is not valid
|
||||||
|
// it returns a nil value.
|
||||||
|
func (privKey PrivKey) PubKey() cryptotypes.PubKey {
|
||||||
|
pk, _ := vrfalgo.PrivateKey(privKey.Key).Public()
|
||||||
|
|
||||||
|
return &PubKey{
|
||||||
|
Key: pk,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equals returns true if two private keys are equal and false otherwise.
|
||||||
|
func (privKey PrivKey) Equals(other cryptotypes.LedgerPrivKey) bool {
|
||||||
|
return privKey.Type() == other.Type() && subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type returns vrf
|
||||||
|
func (privKey PrivKey) Type() string {
|
||||||
|
return KeyType
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute generates the vrf value for the byte slice m using the
|
||||||
|
// underlying private key sk.
|
||||||
|
func (privKey PrivKey) Sign(digestBz []byte) ([]byte, error) {
|
||||||
|
sk := privKey.getVrfPrivateKey()
|
||||||
|
|
||||||
|
return sk.Compute(digestBz), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalAmino overrides Amino binary marshaling.
|
||||||
|
func (privKey PrivKey) MarshalAmino() ([]byte, error) {
|
||||||
|
return privKey.Key, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalAmino overrides Amino binary marshaling.
|
||||||
|
func (privKey *PrivKey) UnmarshalAmino(bz []byte) error {
|
||||||
|
if len(bz) != PrivKeySize {
|
||||||
|
return fmt.Errorf("invalid privkey size, expected %d got %d", PrivKeySize, len(bz))
|
||||||
|
}
|
||||||
|
privKey.Key = bz
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalAminoJSON overrides Amino JSON marshaling.
|
||||||
|
func (privKey PrivKey) MarshalAminoJSON() ([]byte, error) {
|
||||||
|
// When we marshal to Amino JSON, we don't marshal the "key" field itself,
|
||||||
|
// just its contents (i.e. the key bytes).
|
||||||
|
return privKey.MarshalAmino()
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalAminoJSON overrides Amino JSON marshaling.
|
||||||
|
func (privKey *PrivKey) UnmarshalAminoJSON(bz []byte) error {
|
||||||
|
return privKey.UnmarshalAmino(bz)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// vrf Public Key
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ cryptotypes.PubKey = &PubKey{}
|
||||||
|
_ codec.AminoMarshaler = &PubKey{}
|
||||||
|
)
|
||||||
|
|
||||||
|
// func (pubKey PubKey) getVrfPublicKey() vrfalgo.PublicKey {
|
||||||
|
// return vrfalgo.PublicKey(pubKey.Key)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Address returns the address of the ECDSA public key.
|
||||||
|
// The function will return an empty address if the public key is invalid.
|
||||||
|
func (pubKey PubKey) Address() tmcrypto.Address {
|
||||||
|
return tmcrypto.Address(common.BytesToAddress(pubKey.Key).Bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bytes returns the raw bytes of the ECDSA public key.
|
||||||
|
func (pubKey PubKey) Bytes() []byte {
|
||||||
|
bz := make([]byte, len(pubKey.Key))
|
||||||
|
copy(bz, pubKey.Key)
|
||||||
|
|
||||||
|
return bz
|
||||||
|
}
|
||||||
|
|
||||||
|
// String implements the fmt.Stringer interface.
|
||||||
|
func (pubKey PubKey) String() string {
|
||||||
|
return fmt.Sprintf("vrf{%X}", pubKey.Key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type returns vrf
|
||||||
|
func (pubKey PubKey) Type() string {
|
||||||
|
return KeyType
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equals returns true if the pubkey type is the same and their bytes are deeply equal.
|
||||||
|
func (pubKey PubKey) Equals(other cryptotypes.PubKey) bool {
|
||||||
|
return pubKey.Type() == other.Type() && bytes.Equal(pubKey.Bytes(), other.Bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify returns true iff vrf=Compute(m) for the sk that
|
||||||
|
// corresponds to pk.
|
||||||
|
func (pubKey PubKey) VerifySignature(msg, sig []byte) bool {
|
||||||
|
panic("not implement")
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalAmino overrides Amino binary marshaling.
|
||||||
|
func (pubKey PubKey) MarshalAmino() ([]byte, error) {
|
||||||
|
return pubKey.Key, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalAmino overrides Amino binary marshaling.
|
||||||
|
func (pubKey *PubKey) UnmarshalAmino(bz []byte) error {
|
||||||
|
if len(bz) != PubKeySize {
|
||||||
|
return errorsmod.Wrapf(errortypes.ErrInvalidPubKey, "invalid pubkey size, expected %d, got %d", PubKeySize, len(bz))
|
||||||
|
}
|
||||||
|
pubKey.Key = bz
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalAminoJSON overrides Amino JSON marshaling.
|
||||||
|
func (pubKey PubKey) MarshalAminoJSON() ([]byte, error) {
|
||||||
|
// When we marshal to Amino JSON, we don't marshal the "key" field itself,
|
||||||
|
// just its contents (i.e. the key bytes).
|
||||||
|
return pubKey.MarshalAmino()
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalAminoJSON overrides Amino JSON marshaling.
|
||||||
|
func (pubKey *PubKey) UnmarshalAminoJSON(bz []byte) error {
|
||||||
|
return pubKey.UnmarshalAmino(bz)
|
||||||
|
}
|
96
crypto/vrf/vrf_test.go
Normal file
96
crypto/vrf/vrf_test.go
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package vrf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||||
|
|
||||||
|
"encoding/base64"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPrivKey(t *testing.T) {
|
||||||
|
// validate type and equality
|
||||||
|
privKey, err := GenerateKey()
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Implements(t, (*cryptotypes.PrivKey)(nil), privKey)
|
||||||
|
|
||||||
|
// validate inequality
|
||||||
|
privKey2, err := GenerateKey()
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.False(t, privKey.Equals(privKey2))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPrivKey_PubKey(t *testing.T) {
|
||||||
|
privKey, err := GenerateKey()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// validate type and equality
|
||||||
|
pubKey := &PubKey{
|
||||||
|
Key: privKey.PubKey().Bytes(),
|
||||||
|
}
|
||||||
|
require.Implements(t, (*cryptotypes.PubKey)(nil), pubKey)
|
||||||
|
|
||||||
|
// validate inequality
|
||||||
|
privKey2, err := GenerateKey()
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.False(t, pubKey.Equals(privKey2.PubKey()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMarshalAmino(t *testing.T) {
|
||||||
|
aminoCdc := codec.NewLegacyAmino()
|
||||||
|
privKey, err := GenerateKey()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
pubKey := privKey.PubKey().(*PubKey)
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
desc string
|
||||||
|
msg codec.AminoMarshaler
|
||||||
|
typ interface{}
|
||||||
|
expBinary []byte
|
||||||
|
expJSON string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"vrf private key",
|
||||||
|
privKey,
|
||||||
|
&PrivKey{},
|
||||||
|
append([]byte{64}, privKey.Bytes()...), // Length-prefixed.
|
||||||
|
"\"" + base64.StdEncoding.EncodeToString(privKey.Bytes()) + "\"",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vrf public key",
|
||||||
|
pubKey,
|
||||||
|
&PubKey{},
|
||||||
|
append([]byte{32}, pubKey.Bytes()...), // Length-prefixed.
|
||||||
|
"\"" + base64.StdEncoding.EncodeToString(pubKey.Bytes()) + "\"",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.desc, func(t *testing.T) {
|
||||||
|
// Do a round trip of encoding/decoding binary.
|
||||||
|
bz, err := aminoCdc.Marshal(tc.msg)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, tc.expBinary, bz)
|
||||||
|
|
||||||
|
err = aminoCdc.Unmarshal(bz, tc.typ)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
require.Equal(t, tc.msg, tc.typ)
|
||||||
|
|
||||||
|
// Do a round trip of encoding/decoding JSON.
|
||||||
|
bz, err = aminoCdc.MarshalJSON(tc.msg)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, tc.expJSON, string(bz))
|
||||||
|
|
||||||
|
err = aminoCdc.UnmarshalJSON(bz, tc.typ)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
require.Equal(t, tc.msg, tc.typ)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
2
go.mod
2
go.mod
@ -9,6 +9,7 @@ require (
|
|||||||
github.com/cenkalti/backoff/v4 v4.1.3
|
github.com/cenkalti/backoff/v4 v4.1.3
|
||||||
github.com/cometbft/cometbft v0.37.4
|
github.com/cometbft/cometbft v0.37.4
|
||||||
github.com/cometbft/cometbft-db v0.9.1
|
github.com/cometbft/cometbft-db v0.9.1
|
||||||
|
github.com/coniks-sys/coniks-go v0.0.0-20180722014011-11acf4819b71
|
||||||
github.com/cosmos/cosmos-proto v1.0.0-beta.4
|
github.com/cosmos/cosmos-proto v1.0.0-beta.4
|
||||||
github.com/cosmos/cosmos-sdk v0.47.10
|
github.com/cosmos/cosmos-sdk v0.47.10
|
||||||
github.com/cosmos/go-bip39 v1.0.0
|
github.com/cosmos/go-bip39 v1.0.0
|
||||||
@ -179,7 +180,6 @@ require (
|
|||||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
github.com/status-im/keycard-go v0.2.0 // indirect
|
github.com/status-im/keycard-go v0.2.0 // indirect
|
||||||
github.com/stretchr/objx v0.5.0 // indirect
|
|
||||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
|
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
|
||||||
github.com/tendermint/go-amino v0.16.0 // indirect
|
github.com/tendermint/go-amino v0.16.0 // indirect
|
||||||
github.com/tidwall/btree v1.6.0 // indirect
|
github.com/tidwall/btree v1.6.0 // indirect
|
||||||
|
2
go.sum
2
go.sum
@ -388,6 +388,8 @@ github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZ
|
|||||||
github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M=
|
github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M=
|
||||||
github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4=
|
github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4=
|
||||||
github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak=
|
github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak=
|
||||||
|
github.com/coniks-sys/coniks-go v0.0.0-20180722014011-11acf4819b71 h1:MFLTqgfJclmtaQ1SRUrWwmDX/1UBok3XWUethkJ2swQ=
|
||||||
|
github.com/coniks-sys/coniks-go v0.0.0-20180722014011-11acf4819b71/go.mod h1:TrHYHH4Wze7v7Hkwu1MH1W+mCPQKM+gs+PicdEV14o8=
|
||||||
github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
|
github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
|
||||||
github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
|
github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
|
||||||
github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q=
|
github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q=
|
||||||
|
25
proto/crypto/vrf/keys.proto
Normal file
25
proto/crypto/vrf/keys.proto
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Copyright Tharsis Labs Ltd.(Evmos)
|
||||||
|
// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE)
|
||||||
|
syntax = "proto3";
|
||||||
|
package crypto.vrf;
|
||||||
|
|
||||||
|
import "gogoproto/gogo.proto";
|
||||||
|
|
||||||
|
option go_package = "github.com/0glabs/0g-chain/crypto/vrf";
|
||||||
|
|
||||||
|
// PubKey defines a type alias for an vrf.PublicKey that implements
|
||||||
|
// Vrf's PubKey interface. It represents the 32-byte compressed public
|
||||||
|
// key format.
|
||||||
|
message PubKey {
|
||||||
|
option (gogoproto.goproto_stringer) = false;
|
||||||
|
|
||||||
|
// key is the public key in byte form
|
||||||
|
bytes key = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PrivKey defines a type alias for an vrf.PrivateKey that implements
|
||||||
|
// Vrf's PrivateKey interface.
|
||||||
|
message PrivKey {
|
||||||
|
// key is the private key in byte form
|
||||||
|
bytes key = 1;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user