Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: implement p2p protocol and rpc service #221

Merged
merged 22 commits into from
Mar 22, 2023
Merged

feat: implement p2p protocol and rpc service #221

merged 22 commits into from
Mar 22, 2023

Conversation

joeylichang
Copy link
Contributor

@joeylichang joeylichang commented Mar 18, 2023

Description

Implement p2p service.

Rationale

P2P node implements 2 protocols:

Ping protocol

  • Customized ping service, it implemented dynamic update of permanent nodes. As usual, permanent nodes should cover as many SP as possible, which is more decentralized, and also meets SP requirements, eg: getting an approval request needs at least 6 or more replies from different storage providers but p2p nodes are offline, and replacement, which is an inevitable problem, If permanent nodes belonging to the same SP all fail and are replaced, then the SP will be unable to communicate, this requires dynamic updates permanent nodes.
  • PeerProvider implements the pruning function of permanent nodes. Ping service only adds a permanent node, for zombie nodes, PeerProvider's pruning strategy takes into account the information of the storage provider dimension, and uses a very conservative pruning strategy. Nodes are only pruned if there are enough backups and multiple failed interactions, can try to keep each storage provider with enough nodes to try to connect so that each SP has an equal opportunity to receive requests

Approval protocol

  • The primary SP needs to send a GetApproval request to ask whether the other SP is willing to serve the request. the request is sent by p2p protocol.
  • The GetApproval will be signed by the remote SP operator account, and when syncing the payload data to remote SP will be with the Approval and the remote SP will verify the Approval.

Example

N/A

Changes

Notable changes:

  • pkg/p2p
  • service/p2p

@joeylichang joeylichang requested review from will-2012 and sysvm and removed request for will-2012 March 18, 2023 14:02
@joeylichang joeylichang added the wip Working in process label Mar 18, 2023
README.md Show resolved Hide resolved
@@ -3,6 +3,7 @@ package main
import (
"fmt"

"github.com/bnb-chain/greenfield-storage-provider/service/p2p"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix the location of imported pkg

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

config/config.go Outdated
@@ -64,6 +67,7 @@ var DefaultStorageProviderConfig = &StorageProviderConfig{
model.TaskNodeService: model.TaskNodeGRPCAddress,
model.SignerService: model.SignerGRPCAddress,
model.MetadataService: model.MetadataGRPCAddress,
model.P2pService: model.P2PGRPCAddress,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2pService -> P2PService

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

config/config.go Outdated
@@ -74,13 +78,15 @@ var DefaultStorageProviderConfig = &StorageProviderConfig{
model.TaskNodeService: model.TaskNodeGRPCAddress,
model.SignerService: model.SignerGRPCAddress,
model.MetadataService: model.MetadataGRPCAddress,
model.P2pService: model.P2PGRPCAddress,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

@@ -173,6 +174,11 @@ func (cfg *StorageProviderConfig) MakeTaskNodeConfig() (*tasknode.TaskNodeConfig
} else {
return nil, fmt.Errorf("missing signer gRPC address configuration for task node service")
}
if _, ok := cfg.Endpoint[model.P2pService]; ok {
snCfg.P2PGrpcAddress = cfg.Endpoint[model.P2pService]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix snCfg.P2PGrpcAddress to snCfg.P2PGRPCAddress

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

model/const.go Outdated
// P2PGRPCAddress default gRPC address of p2p service
P2PGRPCAddress = "localhost:9833"
// P2PGListenAddress default p2p protocol listen address of p2p node
P2PGListenAddress = "127.0.0.1:9933"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

error spelling of P2PGListenAddress which should be P2PListenAddress

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

// ErrSPMismatch defines the SP's operate address mismatch error
ErrSPMismatch = errors.New("SP's operate address mismatch")
// ErrApprovalExpire defines the SP's operate address mismatch error
ErrApprovalExpire = errors.New("approval expire")
Copy link
Collaborator

@sysvm sysvm Mar 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix ErrApprovalExpire to ErrApprovalExpired
fix errors.New("approval expire") to errors.New("approval expired")

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

@@ -62,6 +62,12 @@ var (
ErrCheckPaymentAccountActive = errors.New("payment account is not active")
// ErrCheckQuotaEnough defines check quota is enough
ErrCheckQuotaEnough = errors.New("quota is not enough")
// ErrSPMismatch defines the SP's operate address mismatch error
ErrSPMismatch = errors.New("SP's operate address mismatch")
Copy link
Collaborator

@sysvm sysvm Mar 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix ErrSPMismatch to ErrMismatchedSP
fix errors.New("SP's operate address mismatch") to errors.New("the operator address of SP is a mismatch");
comment also should be fixed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

// task node service error
var (
// ErrSPApprovalNumber defines failed to insufficient SPs' approvals from p2p server
ErrSPApprovalNumber = errors.New("failed to get sufficient SPs' approvals from p2p server")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix errors.New("failed to get sufficient SPs' approvals from p2p server") to errors.New("failed to get sufficient approvals of SPs from p2p server")

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed


// pattern: /protocol-name/request-or-response-message/version
const GetApprovalRequest = "/approval/request/0.0.1"
const GetApprovalResponse = "/approval/response/0.0.1"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

move these constants to const.go?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The p2p protocol independent, and has no interaction with other parts. It is recommended to separate it first.

defer func() {
if err != nil {
n.peers.DeletePeer(peerID)
log.Warnw("failed to receive pong", "peer_id", peerID, "error", err)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use log.Errorw

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto


err = types.VerifySignature(pong.GetSpOperatorAddress(), pong.GetSignBytes(), pong.GetSignature())
if err != nil {
log.Warnw("failed to verify pong msg signature", "local", s.Conn().LocalPeer(), "remote", s.Conn().RemotePeer(), "error", err)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the same , the ping msg fail is normal

// sp_operator_address define sp operator public key
string sp_operator_address = 2;
// time_out defines the approval valid deadline
int64 time_out = 3;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix time_out to timeout

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

// time_out defines the approval valid deadline
int64 time_out = 3;
// refuse_reason defines the reason of refusing
string refuse_reason = 4;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix refuse_reason to refused_reason

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

// expect_accept defines the number of expecting accept approval
int64 expect_accept = 3;
// time_out defines approval request time out
int64 time_out = 4;
Copy link
Collaborator

@sysvm sysvm Mar 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix time_out to timeout

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

// approval defines the object info for approval
pkg.p2p.types.GetApprovalRequest approval = 1;
// expect_accept defines the number of expecting accept approval
int64 expect_accept = 3;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix expect_accept to expected_accept

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

if strings.Compare(g.config.SpOperatorAddress, approval.GetSpOperatorAddress()) != 0 {
log.Errorw("failed to verify replicate approval's SP operate address",
"approval_operate_address", approval.GetSpOperatorAddress(),
"self_operate_address", g.config.SpOperatorAddress)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix self_operate_address to own_operate_address

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

@joeylichang joeylichang added r4r Ready for review and removed wip Working in process labels Mar 21, 2023
@joeylichang joeylichang requested a review from fynnss March 21, 2023 11:34
README.md Outdated
[P2PConfig]
ListenAddress = "127.0.0.1:9933"
# p2p node msg Secp256k1 encryption key, it is different from other SP's addresses
PrivKey = ""
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aligned with the above, no abbreviation. use PrivateKey?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

@@ -189,6 +191,7 @@ main() {
reset_sp $2
;;
--start)
stop_sp
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add a restart case to ensure to be clearer.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is okay for the time being, because minimizing the commands of local setup script also reduces the complexity of use, and in the scenario of local setup script, it is not possible to run more than 7 SPs at the same time.

Node4="0b5a6480fe664671fd01979fc4278fa393f0abc08c95980f4a900056f035ca7e"
Node5="896caab68f3f3fdbf053ba64a29ce0292c8a5536a2790713b67dd1851f4d77fc"
Node6="ec09def8ee42ac9c23394080ce5bfcdcb1dc57255048a8afc74e9deaae4399cd"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uniformly use uppercase for shell environment variables.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

@@ -24,6 +24,8 @@ var (
BlockSyncerService = strings.ToLower("BlockSyncer")
// ManagerService defines the name of manager service
ManagerService = strings.ToLower("Manager")
// P2PService defines the name of p2p service
P2PService = strings.ToLower("p2p")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p2p as a module name is a bit general, what aboutP2PNode?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you are right.
But it is more user-friendly. In the './gnfd-sp -server p2p' scenario, and other services also does not have 'service' or 'node' suffixes, p2p may be more suitable.

model/const.go Outdated
@@ -37,6 +39,7 @@ var SpServiceDesc = map[string]string{
SignerService: "Sign the transaction and broadcast to chain",
MetadataService: "Provides the ability to query meta data",
BlockSyncerService: "Syncs block data to db",
P2PService: "Service for p2p protocol interaction between SPs",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consistent with above, the verb begins with.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

// approval defines the object info for approval
pkg.p2p.types.GetApprovalRequest approval = 1;
// expected_accept defines the number of expecting accept approval
int64 expected_accept = 3;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

= 2

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed


// SignGetApprovalReqResponse is response type for the SignReplicateApprovalReqMsg RPC method
message SignReplicateApprovalReqMsgResponse {
pkg.p2p.types.GetApprovalRequest approval = 1;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GetApprovalResponse?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

singer RPC have Object/Bucket approval interface. so the approval should have prefix. ReplicateApproval is distinguish from ObjectApproval.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the request here a typo? Replace GetApprovalRequest with GetApprovalResponse?

"own_operate_address", g.config.SpOperatorAddress)
return errors.ErrSPMismatch
}
if time.Now().Unix() > approval.Timeout {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Timeout means expired_time.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed


type P2PConfig struct {
SpOperatorAddress string
GrpcAddress string
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use GRPCAddress, align with other services.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

type P2PConfig struct {
SpOperatorAddress string
GrpcAddress string
SignerGRPCAddress string
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SignerGrpcAddress, align with other services config.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

@joeylichang joeylichang requested review from will-2012 and sysvm March 22, 2023 00:51
cmd/p2p/p2p.go Outdated
},
Category: "P2P COMMANDS",
Description: `
The p2p.create.key creates 'n'' sets of Secp256k1 key pairs, each key pair contains a private key
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'n'' It seems that there is an extra single quotation mark?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Name: "configremote",
Usage: "Flag load config from remote db,if 'configremote' be set, the db.user, " +
Name: "config.remote",
Usage: "Flag load config from remote db,if 'config.remote' be set, the db.user, " +
"db.password and db.address flags are needed, otherwise use default value",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

otherwise use the default value

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Dsn = "localhost:3308"

[P2PConfig]
ListenAddress = "127.0.0.1:9933"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is the difference between this ListenAddress and ListAddress.p2p?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2PConfig.ListenAddress p2p protocol , another is rpc address

model/const.go Outdated
@@ -37,6 +39,7 @@ var SpServiceDesc = map[string]string{
SignerService: "Sign the transaction and broadcast to chain",
MetadataService: "Provides the ability to query meta data",
BlockSyncerService: "Syncs block data to db",
P2PService: "Communicate with SPs on p2p protocol",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

polish Communicate to Communicates, and polish the above SignerService description Signs and Broadcasts if you get time.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed


// SignGetApprovalReqResponse is response type for the SignReplicateApprovalReqMsg RPC method
message SignReplicateApprovalReqMsgResponse {
pkg.p2p.types.GetApprovalRequest approval = 1;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the request here a typo? Replace GetApprovalRequest with GetApprovalResponse?

Accept: accept,
Refuse: refuse,
}
log.CtxInfow(ctx, "success to get approval", "object_id", objectInfo.Id.Uint64(), "accept", len(accept), "refuse", len(refuse))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

succeed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the request here a typo? Replace GetApprovalRequest with GetApprovalResponse?
no , it is the GetApprovalRequest

)

// pattern: /protocol-name/request-or-response-message/version
const GetApprovalRequest = "/approval/request/0.0.1"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the 0.0.1 a protocol version? if yes, I suggest to use v0.0.1

// maintains requests for getting approvals in memory
type ApprovalProtocol struct {
node *Node
response map[uint64]chan *types.GetApprovalResponse
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the key in the map is created first, is there no need to use a lock?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

33 lines define the mutex

func (a *ApprovalProtocol) cancelApprovalRequest(id uint64) {
a.mux.Lock()
defer a.mux.Unlock()
if _, ok := a.response[id]; !ok {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does !ok mean that it has been canceled?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes


// hangApprovalRequest records the approval request in memory for response to router
// notice: the caller need to call cancelApprovalRequest to delete the record
func (a *ApprovalProtocol) hangApprovalRequest(id uint64) (chan *types.GetApprovalResponse, error) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the id means? OperatorAddress of sp?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

objectID

README.md Outdated
Dsn = "localhost:3306"
Dsn = "localhost:3308"
# p2p node configuration
[P2PConfig]
Copy link
Collaborator

@sysvm sysvm Mar 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix P2PConfig to P2PCfg to keep the same style with other services

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Flags: []cli.Flag{
number,
},
Category: "P2P COMMANDS",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

define as a constant

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

next PR, the metrics PR has defined the constant, it should be at the same file

Copy link
Collaborator

@sysvm sysvm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@joeylichang joeylichang merged commit 28bed3e into develop Mar 22, 2023
@joeylichang joeylichang deleted the feat-p2p branch March 22, 2023 07:10
will-2012 added a commit that referenced this pull request Mar 27, 2023
* fix: fix verify permission bug (#225)

* feat: merge release v0.0.4 fix to develop (#230)

* fix: fix route bug

* build: change signer wiltlist ip

* fix: fix https sync failed

* fix: router getUserBucketsRouterName path (#229)

* fix: router getUserBucketsRouterName path and update router comments

Co-authored-by: BarryTong65 <122767193+BarryTong65@users.noreply.github.com>
Co-authored-by: will-2012 <will.w@nodereal.io>

* ci: add gosec action (#231)

* feat: implement p2p protocol and rpc service (#221)

* feat: implement p2p protocol node and RPC service

* feat: p2p RPC server

* fix: config port conflict

* feat: get secondary SP approval from p2p server

* feat: verify approval in gateway

* fix: golang ci lint error

* fix: integration testing bugs

* feat: load p2p private key from ENV var

* feat: implement p2p protocol msg sign and verify

* feat: p2p protocol msg sign in signer service

* feat: signer client method for sign p2p protocol msg

* feat: signature verify in related modules

* fix: manager grace stop

* fix: object Id proto clone to deep copy panic

* feat: p2p create key pairs command

* feat: p2p config to local up script

* fix: local up script deploy p2p error

* fix: pr comments

* fix: change p2p config name for following the project specification

* chore: refine error code

* feat: sp services add metrics (#211)

* feat: sp service adds metrics

* fix: add metrics config

* refactor: refactor metrics service

* fix: update go.mod

* fix: fix config toml template

* chore: coding adjustments

* fix: golang ci lint error

---------

Co-authored-by: DylanYong <dylan.y@nodereal.io>
Co-authored-by: joeylichang <joeycli0919@gmail.com>

* feat: implement metadata payment apis (#235)

* feat: implement metadata payment apis

fix: update commnets and db schema

fix: update OutFlows type json

fix: update metadata

* fix: add the errDesciption and fix requestID

* fix: fix Id & CheckSums

* feat: update bucket id (#241)

* feat: metadata schema update

fix: update config

* fix: update SettleTimestamp and format imports

* fix: fix owner and end_block_number

* fix: adjust check condition to avoid panic (#243)

Co-authored-by: DylanYong <dylan.y@nodereal.io>

* feat: update the juno version (#244)

* feat: resource manager (#246)

* feat: resouce manager

* feat: add resource manager flags

* feat: add resource manager to dowmloader service

* feat: add resource manager to challenge service

* feat: add resource manager to task node service

* chore: rich log info for rcmgr

* feat: init global resource manager

* fix: integration testing bugs

* feat: return preparations error to client during put object

* chore: fix cr comments

* docs: release changlog for v0.0.5 (#249)

* docs: release changlog for v0.0.5

* build: update the greenfield chain version (#248)

* build: update the greenfield chain version

* feat:update juno version

* fix: update metadata for chain v0.0.10

fix: update metadata for chain v0.0.10

fix: update comments for bsdb schema

* fix: update from OneRowId to OneRowID

---------

Co-authored-by: constwz <changbohao30@gmail.com>
Co-authored-by: BarryTong65 <barrytong.work@gmail.com>

---------

Co-authored-by: joeycli <joeycli0919@gmail.com>
Co-authored-by: BarryTong65 <122767193+BarryTong65@users.noreply.github.com>
Co-authored-by: VM <112189277+sysvm@users.noreply.github.com>
Co-authored-by: DylanYong <dylan.y@nodereal.io>
Co-authored-by: krish-nr <krish.z@nodereal.io>
Co-authored-by: krish-z <122767080+krish-nr@users.noreply.github.com>
Co-authored-by: constwz <122766871+constwz@users.noreply.github.com>
Co-authored-by: dylanhuang <j75689@gmail.com>
Co-authored-by: constwz <changbohao30@gmail.com>
Co-authored-by: BarryTong65 <barrytong.work@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
r4r Ready for review
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants