mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-11 07:20:19 +00:00
## Description
In blocks_results we use the proto definition of abciResponses: 2672b91ab0/rpc/core/blocks.go (L152-L155), this leads to the use of the proto definition of the pubkey which is an interface in go (oneof). The interface must be registered with the JSON encoder to have it work correctly.
A clearer divide between proto types and native types is needed.
Closes: #XXX
48 lines
1.3 KiB
Go
48 lines
1.3 KiB
Go
package encoding
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/tendermint/tendermint/crypto"
|
|
"github.com/tendermint/tendermint/crypto/ed25519"
|
|
"github.com/tendermint/tendermint/libs/json"
|
|
pc "github.com/tendermint/tendermint/proto/tendermint/crypto"
|
|
)
|
|
|
|
func init() {
|
|
json.RegisterType((*pc.PublicKey)(nil), "tendermint.crypto.PublicKey")
|
|
json.RegisterType((*pc.PublicKey_Ed25519)(nil), "tendermint.crypto.PublicKey_Ed25519")
|
|
}
|
|
|
|
// PubKeyToProto takes crypto.PubKey and transforms it to a protobuf Pubkey
|
|
func PubKeyToProto(k crypto.PubKey) (pc.PublicKey, error) {
|
|
var kp pc.PublicKey
|
|
switch k := k.(type) {
|
|
case ed25519.PubKey:
|
|
kp = pc.PublicKey{
|
|
Sum: &pc.PublicKey_Ed25519{
|
|
Ed25519: k,
|
|
},
|
|
}
|
|
default:
|
|
return kp, fmt.Errorf("toproto: key type %v is not supported", k)
|
|
}
|
|
return kp, nil
|
|
}
|
|
|
|
// PubKeyFromProto takes a protobuf Pubkey and transforms it to a crypto.Pubkey
|
|
func PubKeyFromProto(k pc.PublicKey) (crypto.PubKey, error) {
|
|
switch k := k.Sum.(type) {
|
|
case *pc.PublicKey_Ed25519:
|
|
if len(k.Ed25519) != ed25519.PubKeySize {
|
|
return nil, fmt.Errorf("invalid size for PubKeyEd25519. Got %d, expected %d",
|
|
len(k.Ed25519), ed25519.PubKeySize)
|
|
}
|
|
pk := make(ed25519.PubKey, ed25519.PubKeySize)
|
|
copy(pk, k.Ed25519)
|
|
return pk, nil
|
|
default:
|
|
return nil, fmt.Errorf("fromproto: key type %v is not supported", k)
|
|
}
|
|
}
|