Skip to content

Commit

Permalink
add document rumlite.md
Browse files Browse the repository at this point in the history
  • Loading branch information
cmcater committed Aug 8, 2023
1 parent e4e4d99 commit 6502117
Show file tree
Hide file tree
Showing 9 changed files with 204 additions and 861 deletions.
573 changes: 0 additions & 573 deletions TBD_howtotest.md

This file was deleted.

194 changes: 4 additions & 190 deletions pkg/chainapi/api/joingroupbyseed.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,7 @@ type JoinGroupBySeedParam struct {
Seed []byte `from:"seed" json:"seed" validate:"required"`
}
type JoinGroupBySeedResult struct {
AppId string `json:"app_key" validate:"required" example:"test_app"`
GroupId string `json:"group_id" validate:"required,uuid4" example:"c0020941-e648-40c9-92dc-682645acd17e"`
GroupName string `json:"group_name" validate:"required" example:"demo group"`
OwnerPubkey string `json:"owner_pubkey" validate:"required" example:"CAISIQLW2nWw+IhoJbTUmoq2ioT5plvvw/QmSeK2uBy090/3hg=="`
UserPubkey string `json:"user_pubkey" validate:"required" example:"CAISIQO7ury6x7aWpwUVn6mj2dZFqme3BAY5xDkYjqW/EbFFcA=="`
UserEncryptPubkey string `json:"user_encryptpubkey" validate:"required" example:"age1774tul0j5wy5y39saeg6enyst4gru2dwp7sjwgd4w9ahl6fkusxq3f8dcm"`
ConsensusType string `json:"consensus_type" validate:"required" example:"poa"`
EncryptionType string `json:"encryption_type" validate:"required" example:"public"`
CipherKey string `json:"cipher_key" validate:"required" example:"076a3cee50f3951744fbe6d973a853171139689fb48554b89f7765c0c6cbf15a"`
GroupItem *quorumpb.GroupItemRumLite `json:"groupItem"`
}

// @Tags Groups
Expand Down Expand Up @@ -66,7 +58,7 @@ func (h *Handler) JoinGroupBySeed() echo.HandlerFunc {

//verify hash and signature
hash := localcrypto.Hash(payload.Seed)
if bytes.Compare(hash, seed.Hash) != 0 {
if !bytes.Equal(hash, seed.Hash) {
msg := fmt.Sprintf("hash not match, expect %s, got %s", hex.EncodeToString(hash), hex.EncodeToString(seed.Hash))
return rumerrors.NewBadRequestError(msg)
}
Expand All @@ -77,8 +69,7 @@ func (h *Handler) JoinGroupBySeed() echo.HandlerFunc {
}

if !verified {
msg := fmt.Sprintf("verify signature failed")
return rumerrors.NewBadRequestError(msg)
return rumerrors.NewBadRequestError("verify signature failed")
}

//verify genesis block
Expand All @@ -99,184 +90,7 @@ func (h *Handler) JoinGroupBySeed() echo.HandlerFunc {
return rumerrors.NewBadRequestError(err)
}

/*
if err != nil {
return rumerrors.NewBadRequestError(err)
}
genesisBlockBytes, err := json.Marshal(seed.GenesisBlock)
if err != nil {
msg := fmt.Sprintf("unmarshal genesis block failed with msg: %s" + err.Error())
return rumerrors.NewBadRequestError(msg)
}
//TBD check if group already exist
groupmgr := chain.GetGroupMgr()
if _, ok := groupmgr.Groups[seed.GroupId]; ok {
msg := fmt.Sprintf("group with group_id <%s> already exist", seed.GroupId)
return rumerrors.NewBadRequestError(msg)
}
nodeoptions := options.GetNodeOptions()
var groupSignPubkey []byte
ks := nodectx.GetNodeCtx().Keystore
dirks, ok := ks.(*localcrypto.DirKeyStore)
if ok {
base64key, err := dirks.GetEncodedPubkey(seed.GenesisBlock.GroupId, localcrypto.Sign)
if err != nil && strings.HasPrefix(err.Error(), "key not exist") {
newsignaddr, err := dirks.NewKeyWithDefaultPassword(seed.GenesisBlock.GroupId, localcrypto.Sign)
if err == nil && newsignaddr != "" {
_, _ = dirks.NewKeyWithDefaultPassword(seed.GenesisBlock.GroupId, localcrypto.Encrypt)
err = nodeoptions.SetSignKeyMap(seed.GenesisBlock.GroupId, newsignaddr)
if err != nil {
msg := fmt.Sprintf("save key map %s err: %s", newsignaddr, err.Error())
return rumerrors.NewBadRequestError(msg)
}
base64key, _ = dirks.GetEncodedPubkey(seed.GenesisBlock.GroupId, localcrypto.Sign)
} else {
_, err := dirks.GetKeyFromUnlocked(localcrypto.Sign.NameString(seed.GenesisBlock.GroupId))
if err != nil {
msg := "create new group key err:" + err.Error()
return rumerrors.NewBadRequestError(msg)
}
base64key, _ = dirks.GetEncodedPubkey(seed.GenesisBlock.GroupId, localcrypto.Sign)
}
}
groupSignPubkey, err = base64.RawURLEncoding.DecodeString(base64key)
if err != nil {
msg := "group key can't be decoded, err:" + err.Error()
return rumerrors.NewBadRequestError(msg)
}
} else {
msg := fmt.Sprintf("unknown keystore type %v:", ks)
return rumerrors.NewBadRequestError(msg)
}
ownerPubkeyBytes, err := base64.RawURLEncoding.DecodeString(seed.GenesisBlock.ProducerPubkey)
if err != nil {
msg := "Decode OwnerPubkey failed: " + err.Error()
return rumerrors.NewBadRequestError(msg)
}
groupEncryptkey, err := dirks.GetEncodedPubkey(seed.GenesisBlock.GroupId, localcrypto.Encrypt)
if err != nil {
if strings.HasPrefix(err.Error(), "key not exist") {
_, _ = dirks.NewKeyWithDefaultPassword(seed.GenesisBlock.GroupId, localcrypto.Encrypt)
_, err := dirks.GetKeyFromUnlocked(localcrypto.Encrypt.NameString(seed.GenesisBlock.GroupId))
if err != nil {
msg := "Create key pair failed with msg:" + err.Error()
return rumerrors.NewBadRequestError(msg)
}
groupEncryptkey, _ = dirks.GetEncodedPubkey(seed.GenesisBlock.GroupId, localcrypto.Encrypt)
} else {
msg := "Create key pair failed with msg:" + err.Error()
return rumerrors.NewBadRequestError(msg)
}
}
r, err := rumchaindata.ValidGenesisBlock(seed.GenesisBlock)
if err != nil {
return rumerrors.NewBadRequestError(err)
}
if !r {
msg := "Join Group failed, verify genesis block failed"
return rumerrors.NewBadRequestError(msg)
}
item := &quorumpb.GroupItem{}
item.GroupId = seed.GroupId
item.GroupName = seed.GroupName
item.OwnerPubKey = seed.OwnerPubkey
item.CipherKey = seed.CipherKey
item.AppKey = seed.AppKey
if seed.ConsensusType == "poa" {
item.ConsenseType = quorumpb.GroupConsenseType_POA
} else if seed.ConsensusType == "pos" {
item.ConsenseType = quorumpb.GroupConsenseType_POS
}
item.UserSignPubkey = base64.RawURLEncoding.EncodeToString(groupSignPubkey)
userEncryptKey, err := dirks.GetEncodedPubkey(seed.GenesisBlock.GroupId, localcrypto.Encrypt)
if err != nil {
if strings.HasPrefix(err.Error(), "key not exist") {
userEncryptKey, err = dirks.NewKeyWithDefaultPassword(seed.GenesisBlock.GroupId, localcrypto.Encrypt)
if err != nil {
msg := "Create key pair failed with msg:" + err.Error()
return rumerrors.NewBadRequestError(msg)
}
} else {
msg := "Create key pair failed with msg:" + err.Error()
return rumerrors.NewBadRequestError(msg)
}
}
item.UserEncryptPubkey = userEncryptKey
if seed.EncryptionType == "public" {
item.EncryptType = quorumpb.GroupEncryptType_PUBLIC
} else {
item.EncryptType = quorumpb.GroupEncryptType_PRIVATE
}
item.LastUpdate = seed.GenesisBlock.TimeStamp
item.GenesisBlock = seed.GenesisBlock
//create the group
group := &chain.Group{}
err = group.JoinGroup(item)
if err != nil {
return rumerrors.NewBadRequestError(err)
}
//start sync
err = group.StartSync()
if err != nil {
return rumerrors.NewBadRequestError(err)
}
//add group to context
groupmgr.Groups[group.Item.GroupId] = group
var bufferResult bytes.Buffer
bufferResult.Write(genesisBlockBytes)
bufferResult.Write([]byte(item.GroupId))
bufferResult.Write([]byte(item.GroupName))
bufferResult.Write(ownerPubkeyBytes)
bufferResult.Write(groupSignPubkey)
bufferResult.Write([]byte(groupEncryptkey))
bufferResult.Write([]byte(item.CipherKey))
hashResult := localcrypto.Hash(bufferResult.Bytes())
signature, _ := ks.EthSignByKeyName(item.GroupId, hashResult)
encodedSign := hex.EncodeToString(signature)
joinGrpResult := &JoinGroupResult{
GroupId: item.GroupId,
GroupName: item.GroupName,
OwnerPubkey: item.OwnerPubKey,
ConsensusType: seed.ConsensusType,
EncryptionType: seed.EncryptionType,
UserPubkey: item.UserSignPubkey,
UserEncryptPubkey: groupEncryptkey,
CipherKey: item.CipherKey,
AppKey: item.AppKey,
Signature: encodedSign,
}
// save group seed to appdata
pbGroupSeed := handlers.ToPbGroupSeed(*seed)
if err := h.Appdb.SetGroupSeed(&pbGroupSeed); err != nil {
msg := fmt.Sprintf("save group seed failed: %s", err)
return rumerrors.NewBadRequestError(msg)
}
return c.JSON(http.StatusOK, joinGrpResult)
*/
return cc.JSON(http.StatusOK, JoinGroupBySeedResult{GroupItem: groupItem})

return c.JSON(http.StatusOK, nil)
}
}
10 changes: 5 additions & 5 deletions pkg/chainapi/api/keystore.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ import (
)

// @Tags Groups
// @Summary CreateGroupUrl
// @Description Create a new group
// @Summary CreateSignKey
// @Description Create a new eth sign key pair
// @Accept json
// @Produce json
// @Param data body handlers.CreateGroupParam true "GroupInfo"
// @Success 200 {object} handlers.CreateGroupResult
// @Router /api/v1/group [post]
// @Param data body handlers.CreateSignKeyParams true "SignKeyInfo"
// @Success 200 {object} handlers.CreateSignKeyResult
// @Router /api/v2/rumlite/keystore/createsignkey [post]
func (h *Handler) CreateSignKey() echo.HandlerFunc {
return func(c echo.Context) error {
cc := c.(*utils.CustomContext)
Expand Down
10 changes: 5 additions & 5 deletions pkg/chainapi/api/newseed.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ import (
)

// @Tags Groups
// @Summary CreateGroupUrl
// @Description Create a new group
// @Summary NewSeed
// @Description Create a new group seed
// @Accept json
// @Produce json
// @Param data body handlers.CreateGroupParam true "GroupInfo"
// @Success 200 {object} handlers.CreateGroupResult
// @Router /api/v1/group [post]
// @Param data body handlers.NewGroupSeedParams true "GroupInfo"
// @Success 200 {object} handlers.NewGroupSeedResult
// @Router /api/v2/rumlite/group/newseed [post]
func (h *Handler) NewSeed() echo.HandlerFunc {
return func(c echo.Context) error {
cc := c.(*utils.CustomContext)
Expand Down
2 changes: 1 addition & 1 deletion pkg/chainapi/api/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func StartRumNodeServer(config StartServerParam, signalch chan os.Signal, h *Han
r.GET("/quit", quitapp)

r.POST("/v2/rumlite/group/newseed", h.NewSeed())
r.POST("/v2/rumlite/group/joinbyseed", h.JoinGroupBySeed())
r.POST("/v2/rumlite/group/joingroupbyseed", h.JoinGroupBySeed())
r.POST("/v2/rumlite/keystore/createsignkey", h.CreateSignKey())

//r.POST("/v2/group/joinbyurl", h.JoinGroupByUrl()) TBD
Expand Down
27 changes: 14 additions & 13 deletions pkg/chainapi/handlers/newseed.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ type NewGroupSeedParams struct {
ConsensusType string `from:"consensus_type" json:"consensus_type" validate:"required,oneof=pos poa" example:"poa"`
SyncType string `from:"sync_type" json:"sync_type" validate:"required,oneof=public private" example:"public"`
EncryptTrx bool `from:"encrypt_trx" json:"encrypt_trx" validate:"required" example:"true"`
ChainType string `from:"chain_type" json:"chain_type" validate:"required,oneof=archive dynamic" example:"archive"`
CtnType string `from:"ctn_type" json:"ctn_type" validate:"required,oneof=blob service" example:"blob"`
OwnerKeyName string `from:"owner_keyname" json:"owner_keyname" example:"group_owner_key_name"`
TrxSignKeyName string `from:"trx_sign_keyname" json:"trx_sign_keyname" example:"my_sign_pubkey_name"`
NeoProducerKeyName string `from:"neoproducer_sign_keyname" json:"neoproducer_sign_keyname" example:"general_producer_pubkey_name"`
Expand Down Expand Up @@ -62,13 +62,13 @@ func NewGroupSeed(params *NewGroupSeedParams, nodeoptions *options.NodeOptions)
return nil, errors.New("sync_type must be public or private")
}

var chainType quorumpb.GroupChainType
if params.ChainType == "archive" {
chainType = quorumpb.GroupChainType_ARCHIVE_CHAIN
} else if params.ChainType == "dynamic" {
chainType = quorumpb.GroupChainType_DYNAMIC_CHAIN
var ctnType quorumpb.GroupCtnType
if params.CtnType == "blob" {
ctnType = quorumpb.GroupCtnType_BLOB
} else if params.CtnType == "service" {
ctnType = quorumpb.GroupCtnType_SERVICE
} else {
return nil, errors.New("chain_type must be archive or dynamic")
return nil, errors.New("chain_type must be \"blob\" or \"service\"")
}

groupid := guuid.New().String()
Expand Down Expand Up @@ -108,18 +108,19 @@ func NewGroupSeed(params *NewGroupSeedParams, nodeoptions *options.NodeOptions)
}
}

var producers []string
var producerPubkey string
var producerKeyName string
var producers []string
if params.NeoProducerKeyName != "" {
producerKeyName = params.NeoProducerKeyName
producerPubkey, err := ks.GetEncodedPubkey(producerKeyName, localcrypto.Sign)
producerPubkey, err = ks.GetEncodedPubkey(producerKeyName, localcrypto.Sign)
if err != nil {
return nil, errors.New("producer_sign_keyname not found in local keystore")
}
producers = append(producers, producerPubkey)
} else {
producerKeyName = groupid + NEOPROUDCER_SIGNKEY_SURFIX
producerPubkey, err := localcrypto.InitSignKeyWithKeyName(producerKeyName, nodeoptions)
producerPubkey, err = localcrypto.InitSignKeyWithKeyName(producerKeyName, nodeoptions)
if err != nil {
return nil, errors.New("initial group producer sign key failed, err:" + err.Error())
}
Expand Down Expand Up @@ -154,7 +155,7 @@ func NewGroupSeed(params *NewGroupSeedParams, nodeoptions *options.NodeOptions)
}

//create genesis block
genesisBlock, err := rumchaindata.CreateGenesisBlockRumLiteByEthKey(groupid, ownerPubkey, ownerKeyName, consensusInfo)
genesisBlock, err := rumchaindata.CreateGenesisBlockRumLiteByEthKey(groupid, producerPubkey, producerKeyName, consensusInfo)
if err != nil {
return nil, err
}
Expand All @@ -166,10 +167,10 @@ func NewGroupSeed(params *NewGroupSeedParams, nodeoptions *options.NodeOptions)
GroupId: groupid,
OwnerPubKey: ownerPubkey,
TrxSignPubkey: trxSignPubkey,
EncryptTrx: params.EncryptTrx,
EncryptTrxCtn: params.EncryptTrx,
CipherKey: cipherKey,
SyncType: syncType,
ChainType: chainType,
CtnType: ctnType,
ConsenseType: consensusType,
ConsensusInfo: consensusInfo,
GenesisBlock: genesisBlock,
Expand Down
Loading

0 comments on commit 6502117

Please sign in to comment.