mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 12:57:27 +00:00 
			
		
		
		
	add vrf
This commit is contained in:
		
							parent
							
								
									77ec52e16b
								
							
						
					
					
						commit
						a437523ea2
					
				@ -12,6 +12,7 @@ import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/config"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/debug"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/flags"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/crypto/keyring"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/server"
 | 
			
		||||
	servertypes "github.com/cosmos/cosmos-sdk/server/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
			
		||||
@ -32,15 +33,16 @@ import (
 | 
			
		||||
	"github.com/Kava-Labs/opendb"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// EnvPrefix is the prefix environment variables must have to configure the app.
 | 
			
		||||
const EnvPrefix = "KAVA"
 | 
			
		||||
func customKeyringOptions() keyring.Option {
 | 
			
		||||
	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 {
 | 
			
		||||
	app.SetSDKConfig().Seal()
 | 
			
		||||
 | 
			
		||||
	encodingConfig := app.MakeEncodingConfig()
 | 
			
		||||
 | 
			
		||||
	initClientCtx := client.Context{}.
 | 
			
		||||
		WithCodec(encodingConfig.Marshaler).
 | 
			
		||||
		WithInterfaceRegistry(encodingConfig.InterfaceRegistry).
 | 
			
		||||
@ -49,13 +51,13 @@ func NewRootCmd() *cobra.Command {
 | 
			
		||||
		WithInput(os.Stdin).
 | 
			
		||||
		WithAccountRetriever(types.AccountRetriever{}).
 | 
			
		||||
		WithBroadcastMode(flags.FlagBroadcastMode).
 | 
			
		||||
		WithHomeDir(app.DefaultNodeHome).
 | 
			
		||||
		WithHomeDir(chaincfg.DefaultNodeHome).
 | 
			
		||||
		WithKeyringOptions(hd.EthSecp256k1Option()).
 | 
			
		||||
		WithViper(EnvPrefix)
 | 
			
		||||
		WithViper(chaincfg.EnvPrefix)
 | 
			
		||||
 | 
			
		||||
	rootCmd := &cobra.Command{
 | 
			
		||||
		Use:   "kava",
 | 
			
		||||
		Short: "Daemon and CLI for the Kava blockchain.",
 | 
			
		||||
		Use:   chaincfg.AppName,
 | 
			
		||||
		Short: "Daemon and CLI for the 0g-chain blockchain.",
 | 
			
		||||
		PersistentPreRunE: func(cmd *cobra.Command, _ []string) error {
 | 
			
		||||
			cmd.SetOut(cmd.OutOrStdout())
 | 
			
		||||
			cmd.SetErr(cmd.ErrOrStderr())
 | 
			
		||||
@ -74,7 +76,7 @@ func NewRootCmd() *cobra.Command {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			customAppTemplate, customAppConfig := servercfg.AppConfig("ukava")
 | 
			
		||||
			customAppTemplate, customAppConfig := servercfg.AppConfig(chaincfg.BaseDenom)
 | 
			
		||||
 | 
			
		||||
			return server.InterceptConfigsPreRunHandler(
 | 
			
		||||
				cmd,
 | 
			
		||||
@ -85,7 +87,7 @@ func NewRootCmd() *cobra.Command {
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	addSubCmds(rootCmd, encodingConfig, app.DefaultNodeHome)
 | 
			
		||||
	addSubCmds(rootCmd, encodingConfig, chaincfg.DefaultNodeHome)
 | 
			
		||||
 | 
			
		||||
	return rootCmd
 | 
			
		||||
}
 | 
			
		||||
@ -126,7 +128,7 @@ func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, de
 | 
			
		||||
 | 
			
		||||
	opts := ethermintserver.StartOptions{
 | 
			
		||||
		AppCreator:      ac.newApp,
 | 
			
		||||
		DefaultNodeHome: app.DefaultNodeHome,
 | 
			
		||||
		DefaultNodeHome: chaincfg.DefaultNodeHome,
 | 
			
		||||
		DBOpener:        dbOpener,
 | 
			
		||||
	}
 | 
			
		||||
	// ethermintserver adds additional flags to start the JSON-RPC server for evm support
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										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/gogo/protobuf/gogoproto"
 | 
			
		||||
	proto "github.com/gogo/protobuf/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"
 | 
			
		||||
	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"
 | 
			
		||||
	tmcrypto "github.com/tendermint/tendermint/crypto"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							@ -401,6 +401,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/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/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.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=
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										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