mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-10-31 23:17:27 +00:00 
			
		
		
		
	add vrf
This commit is contained in:
		
							parent
							
								
									cc4f72b165
								
							
						
					
					
						commit
						0bbaeb0393
					
				| @ -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,18 +26,21 @@ 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/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). | ||||||
| @ -44,14 +48,21 @@ func NewRootCmd() *cobra.Command { | |||||||
| 		WithLegacyAmino(encodingConfig.Amino). | 		WithLegacyAmino(encodingConfig.Amino). | ||||||
| 		WithInput(os.Stdin). | 		WithInput(os.Stdin). | ||||||
| 		WithAccountRetriever(types.AccountRetriever{}). | 		WithAccountRetriever(types.AccountRetriever{}). | ||||||
|  | <<<<<<< HEAD | ||||||
| 		WithBroadcastMode(flags.FlagBroadcastMode). | 		WithBroadcastMode(flags.FlagBroadcastMode). | ||||||
| 		WithHomeDir(app.DefaultNodeHome). | 		WithHomeDir(app.DefaultNodeHome). | ||||||
| 		WithKeyringOptions(hd.EthSecp256k1Option()). | 		WithKeyringOptions(hd.EthSecp256k1Option()). | ||||||
| 		WithViper(EnvPrefix) | 		WithViper(EnvPrefix) | ||||||
|  | ======= | ||||||
|  | 		WithBroadcastMode(flags.BroadcastBlock). | ||||||
|  | 		WithHomeDir(chaincfg.DefaultNodeHome). | ||||||
|  | 		WithKeyringOptions(customKeyringOptions()). | ||||||
|  | 		WithViper(chaincfg.EnvPrefix) | ||||||
|  | >>>>>>> be1cd76f (add vrf) | ||||||
| 
 | 
 | ||||||
| 	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()) | ||||||
| @ -70,7 +81,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, | ||||||
| @ -81,12 +92,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 { | ||||||
| @ -115,7 +126,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
 | ||||||
|  | |||||||
							
								
								
									
										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) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										5
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								go.mod
									
									
									
									
									
								
							| @ -9,8 +9,9 @@ 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/cosmos/cosmos-proto v1.0.0-beta.4 | 	github.com/coniks-sys/coniks-go v0.0.0-20180722014011-11acf4819b71 | ||||||
| 	github.com/cosmos/cosmos-sdk v0.47.10 | 	github.com/cosmos/cosmos-proto v1.0.0-beta.3 | ||||||
|  | 	github.com/cosmos/cosmos-sdk v0.47.7 | ||||||
| 	github.com/cosmos/go-bip39 v1.0.0 | 	github.com/cosmos/go-bip39 v1.0.0 | ||||||
| 	github.com/cosmos/gogoproto v1.4.10 | 	github.com/cosmos/gogoproto v1.4.10 | ||||||
| 	github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v7 v7.1.3 | 	github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v7 v7.1.3 | ||||||
|  | |||||||
							
								
								
									
										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
	 Solovyov1796
						Solovyov1796