diff --git a/app/appmessage/message.go b/app/appmessage/message.go
index 22c023428..fe6afb4fb 100644
--- a/app/appmessage/message.go
+++ b/app/appmessage/message.go
@@ -137,6 +137,8 @@ const (
CmdPruningPointUTXOSetOverrideNotificationMessage
CmdStopNotifyingPruningPointUTXOSetOverrideRequestMessage
CmdStopNotifyingPruningPointUTXOSetOverrideResponseMessage
+ CmdEstimateNetworkHashesPerSecondRequestMessage
+ CmdEstimateNetworkHashesPerSecondResponseMessage
)
// ProtocolMessageCommandToString maps all MessageCommands to their string representation
@@ -248,6 +250,8 @@ var RPCMessageCommandToString = map[MessageCommand]string{
CmdPruningPointUTXOSetOverrideNotificationMessage: "PruningPointUTXOSetOverrideNotification",
CmdStopNotifyingPruningPointUTXOSetOverrideRequestMessage: "StopNotifyingPruningPointUTXOSetOverrideRequest",
CmdStopNotifyingPruningPointUTXOSetOverrideResponseMessage: "StopNotifyingPruningPointUTXOSetOverrideResponse",
+ CmdEstimateNetworkHashesPerSecondRequestMessage: "EstimateNetworkHashesPerSecondRequest",
+ CmdEstimateNetworkHashesPerSecondResponseMessage: "EstimateNetworkHashesPerSecondResponse",
}
// Message is an interface that describes a kaspa message. A type that
diff --git a/app/appmessage/rpc_estimate_network_hashes_per_second.go b/app/appmessage/rpc_estimate_network_hashes_per_second.go
new file mode 100644
index 000000000..48fe6c46e
--- /dev/null
+++ b/app/appmessage/rpc_estimate_network_hashes_per_second.go
@@ -0,0 +1,41 @@
+package appmessage
+
+// EstimateNetworkHashesPerSecondRequestMessage is an appmessage corresponding to
+// its respective RPC message
+type EstimateNetworkHashesPerSecondRequestMessage struct {
+ baseMessage
+ WindowSize uint32
+}
+
+// Command returns the protocol command string for the message
+func (msg *EstimateNetworkHashesPerSecondRequestMessage) Command() MessageCommand {
+ return CmdEstimateNetworkHashesPerSecondRequestMessage
+}
+
+// NewEstimateNetworkHashesPerSecondRequestMessage returns a instance of the message
+func NewEstimateNetworkHashesPerSecondRequestMessage(windowSize uint32) *EstimateNetworkHashesPerSecondRequestMessage {
+ return &EstimateNetworkHashesPerSecondRequestMessage{
+ WindowSize: windowSize,
+ }
+}
+
+// EstimateNetworkHashesPerSecondResponseMessage is an appmessage corresponding to
+// its respective RPC message
+type EstimateNetworkHashesPerSecondResponseMessage struct {
+ baseMessage
+ NetworkHashesPerSecond uint64
+
+ Error *RPCError
+}
+
+// Command returns the protocol command string for the message
+func (msg *EstimateNetworkHashesPerSecondResponseMessage) Command() MessageCommand {
+ return CmdEstimateNetworkHashesPerSecondResponseMessage
+}
+
+// NewEstimateNetworkHashesPerSecondResponseMessage returns a instance of the message
+func NewEstimateNetworkHashesPerSecondResponseMessage(networkHashesPerSecond uint64) *EstimateNetworkHashesPerSecondResponseMessage {
+ return &EstimateNetworkHashesPerSecondResponseMessage{
+ NetworkHashesPerSecond: networkHashesPerSecond,
+ }
+}
diff --git a/app/protocol/flows/testing/handle_relay_invs_test.go b/app/protocol/flows/testing/handle_relay_invs_test.go
index ba6725039..a50864378 100644
--- a/app/protocol/flows/testing/handle_relay_invs_test.go
+++ b/app/protocol/flows/testing/handle_relay_invs_test.go
@@ -130,6 +130,10 @@ type fakeRelayInvsContext struct {
rwLock sync.RWMutex
}
+func (f *fakeRelayInvsContext) EstimateNetworkHashesPerSecond(windowSize int) (uint64, error) {
+ panic(errors.Errorf("called unimplemented function from test '%s'", f.testName))
+}
+
func (f *fakeRelayInvsContext) GetBlockRelations(blockHash *externalapi.DomainHash) ([]*externalapi.DomainHash, *externalapi.DomainHash, []*externalapi.DomainHash, error) {
panic(errors.Errorf("called unimplemented function from test '%s'", f.testName))
}
diff --git a/app/rpc/rpc.go b/app/rpc/rpc.go
index ec87c698e..ddf3957a0 100644
--- a/app/rpc/rpc.go
+++ b/app/rpc/rpc.go
@@ -44,6 +44,7 @@ var handlers = map[appmessage.MessageCommand]handler{
appmessage.CmdGetInfoRequestMessage: rpchandlers.HandleGetInfo,
appmessage.CmdNotifyPruningPointUTXOSetOverrideRequestMessage: rpchandlers.HandleNotifyPruningPointUTXOSetOverrideRequest,
appmessage.CmdStopNotifyingPruningPointUTXOSetOverrideRequestMessage: rpchandlers.HandleStopNotifyingPruningPointUTXOSetOverrideRequest,
+ appmessage.CmdEstimateNetworkHashesPerSecondRequestMessage: rpchandlers.HandleEstimateNetworkHashesPerSecond,
}
func (m *Manager) routerInitializer(router *router.Router, netConnection *netadapter.NetConnection) {
diff --git a/app/rpc/rpchandlers/estimate_network_hashes_per_second.go b/app/rpc/rpchandlers/estimate_network_hashes_per_second.go
new file mode 100644
index 000000000..41e359a5f
--- /dev/null
+++ b/app/rpc/rpchandlers/estimate_network_hashes_per_second.go
@@ -0,0 +1,23 @@
+package rpchandlers
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/kaspanet/kaspad/app/rpc/rpccontext"
+ "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router"
+)
+
+// HandleEstimateNetworkHashesPerSecond handles the respectively named RPC command
+func HandleEstimateNetworkHashesPerSecond(context *rpccontext.Context, _ *router.Router, request appmessage.Message) (appmessage.Message, error) {
+ estimateNetworkHashesPerSecondRequest := request.(*appmessage.EstimateNetworkHashesPerSecondRequestMessage)
+
+ windowSize := int(estimateNetworkHashesPerSecondRequest.WindowSize)
+ networkHashesPerSecond, err := context.Domain.Consensus().EstimateNetworkHashesPerSecond(windowSize)
+ if err != nil {
+ response := &appmessage.EstimateNetworkHashesPerSecondResponseMessage{}
+ response.Error = appmessage.RPCErrorf("could not resolve network hashes per "+
+ "second for window size %d: %s", windowSize, err)
+ return response, nil
+ }
+
+ return appmessage.NewEstimateNetworkHashesPerSecondResponseMessage(networkHashesPerSecond), nil
+}
diff --git a/cmd/kaspactl/commands.go b/cmd/kaspactl/commands.go
index 51d4cefb5..946d6b13e 100644
--- a/cmd/kaspactl/commands.go
+++ b/cmd/kaspactl/commands.go
@@ -24,6 +24,7 @@ var commandTypes = []reflect.Type{
reflect.TypeOf(protowire.KaspadMessage_GetVirtualSelectedParentBlueScoreRequest{}),
reflect.TypeOf(protowire.KaspadMessage_GetVirtualSelectedParentChainFromBlockRequest{}),
reflect.TypeOf(protowire.KaspadMessage_ResolveFinalityConflictRequest{}),
+ reflect.TypeOf(protowire.KaspadMessage_EstimateNetworkHashesPerSecondRequest{}),
reflect.TypeOf(protowire.KaspadMessage_GetBlockTemplateRequest{}),
reflect.TypeOf(protowire.KaspadMessage_SubmitBlockRequest{}),
diff --git a/domain/consensus/consensus.go b/domain/consensus/consensus.go
index 69907e3f1..4a18fb42b 100644
--- a/domain/consensus/consensus.go
+++ b/domain/consensus/consensus.go
@@ -505,3 +505,10 @@ func (s *consensus) Anticone(blockHash *externalapi.DomainHash) ([]*externalapi.
return s.dagTraversalManager.Anticone(stagingArea, blockHash)
}
+
+func (s *consensus) EstimateNetworkHashesPerSecond(windowSize int) (uint64, error) {
+ s.lock.Lock()
+ defer s.lock.Unlock()
+
+ return s.difficultyManager.EstimateNetworkHashesPerSecond(windowSize)
+}
diff --git a/domain/consensus/model/externalapi/consensus.go b/domain/consensus/model/externalapi/consensus.go
index 46c0fafae..3a25c1679 100644
--- a/domain/consensus/model/externalapi/consensus.go
+++ b/domain/consensus/model/externalapi/consensus.go
@@ -32,4 +32,5 @@ type Consensus interface {
IsInSelectedParentChainOf(blockHashA *DomainHash, blockHashB *DomainHash) (bool, error)
GetHeadersSelectedTip() (*DomainHash, error)
Anticone(blockHash *DomainHash) ([]*DomainHash, error)
+ EstimateNetworkHashesPerSecond(windowSize int) (uint64, error)
}
diff --git a/domain/consensus/model/interface_processes_difficultymanager.go b/domain/consensus/model/interface_processes_difficultymanager.go
index 27e45af35..999e74ec0 100644
--- a/domain/consensus/model/interface_processes_difficultymanager.go
+++ b/domain/consensus/model/interface_processes_difficultymanager.go
@@ -1,10 +1,13 @@
package model
-import "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+import (
+ "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
+)
// DifficultyManager provides a method to resolve the
// difficulty value of a block
type DifficultyManager interface {
StageDAADataAndReturnRequiredDifficulty(stagingArea *StagingArea, blockHash *externalapi.DomainHash) (uint32, error)
RequiredDifficulty(stagingArea *StagingArea, blockHash *externalapi.DomainHash) (uint32, error)
+ EstimateNetworkHashesPerSecond(windowSize int) (uint64, error)
}
diff --git a/domain/consensus/processes/blockvalidator/pruning_violation_proof_of_work_and_difficulty_test.go b/domain/consensus/processes/blockvalidator/pruning_violation_proof_of_work_and_difficulty_test.go
index bda80bca5..73b595774 100644
--- a/domain/consensus/processes/blockvalidator/pruning_violation_proof_of_work_and_difficulty_test.go
+++ b/domain/consensus/processes/blockvalidator/pruning_violation_proof_of_work_and_difficulty_test.go
@@ -312,3 +312,7 @@ func (dm *mocDifficultyManager) StageDAADataAndReturnRequiredDifficulty(stagingA
return dm.testDifficulty, nil
}
+
+func (dm *mocDifficultyManager) EstimateNetworkHashesPerSecond(windowSize int) (uint64, error) {
+ return 0, nil
+}
diff --git a/domain/consensus/processes/difficultymanager/blockwindow.go b/domain/consensus/processes/difficultymanager/blockwindow.go
index ec5600b5f..f3845fe54 100644
--- a/domain/consensus/processes/difficultymanager/blockwindow.go
+++ b/domain/consensus/processes/difficultymanager/blockwindow.go
@@ -31,7 +31,7 @@ func (dm *difficultyManager) getDifficultyBlock(
}
// blockWindow returns a blockWindow of the given size that contains the
-// blocks in the past of startindNode, the sorting is unspecified.
+// blocks in the past of startingNode, the sorting is unspecified.
// If the number of blocks in the past of startingNode is less then windowSize,
// the window will be padded by genesis blocks to achieve a size of windowSize.
func (dm *difficultyManager) blockWindow(stagingArea *model.StagingArea, startingNode *externalapi.DomainHash, windowSize int) (blockWindow,
diff --git a/domain/consensus/processes/difficultymanager/hashrate.go b/domain/consensus/processes/difficultymanager/hashrate.go
new file mode 100644
index 000000000..1bd04e10e
--- /dev/null
+++ b/domain/consensus/processes/difficultymanager/hashrate.go
@@ -0,0 +1,64 @@
+package difficultymanager
+
+import (
+ "github.com/kaspanet/kaspad/domain/consensus/model"
+ "github.com/kaspanet/kaspad/infrastructure/logger"
+ "github.com/pkg/errors"
+ "math/big"
+)
+
+func (dm *difficultyManager) EstimateNetworkHashesPerSecond(windowSize int) (uint64, error) {
+ onEnd := logger.LogAndMeasureExecutionTime(log, "EstimateNetworkHashesPerSecond")
+ defer onEnd()
+
+ stagingArea := model.NewStagingArea()
+ return dm.estimateNetworkHashesPerSecond(stagingArea, windowSize)
+}
+
+func (dm *difficultyManager) estimateNetworkHashesPerSecond(stagingArea *model.StagingArea, windowSize int) (uint64, error) {
+ if windowSize < 2 {
+ return 0, errors.Errorf("windowSize must be equal to or greater than 2")
+ }
+
+ blockWindow, windowHashes, err := dm.blockWindow(stagingArea, model.VirtualBlockHash, windowSize)
+ if err != nil {
+ return 0, err
+ }
+
+ // return 0 if no blocks had been mined yet
+ if len(windowHashes) == 0 {
+ return 0, nil
+ }
+
+ minWindowTimestamp, maxWindowTimestamp, _, _ := blockWindow.minMaxTimestamps()
+ if minWindowTimestamp == maxWindowTimestamp {
+ return 0, errors.Errorf("min window timestamp is equal to the max window timestamp")
+ }
+
+ firstHash := windowHashes[0]
+ firstBlockGHOSTDAGData, err := dm.ghostdagStore.Get(dm.databaseContext, stagingArea, firstHash)
+ if err != nil {
+ return 0, err
+ }
+ firstBlockBlueWork := firstBlockGHOSTDAGData.BlueWork()
+ minWindowBlueWork := firstBlockBlueWork
+ maxWindowBlueWork := firstBlockBlueWork
+ for _, hash := range windowHashes[1:] {
+ blockGHOSTDAGData, err := dm.ghostdagStore.Get(dm.databaseContext, stagingArea, hash)
+ if err != nil {
+ return 0, err
+ }
+ blockBlueWork := blockGHOSTDAGData.BlueWork()
+ if blockBlueWork.Cmp(minWindowBlueWork) < 0 {
+ minWindowBlueWork = blockBlueWork
+ }
+ if blockBlueWork.Cmp(maxWindowBlueWork) > 0 {
+ maxWindowBlueWork = blockBlueWork
+ }
+ }
+
+ nominator := new(big.Int).Sub(maxWindowBlueWork, minWindowBlueWork)
+ denominator := big.NewInt((maxWindowTimestamp - minWindowTimestamp) / 1000) // Divided by 1000 to convert milliseconds to seconds
+ networkHashesPerSecondBigInt := new(big.Int).Div(nominator, denominator)
+ return networkHashesPerSecondBigInt.Uint64(), nil
+}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go
index 588fdb26b..dccb9f405 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.pb.go
@@ -134,6 +134,8 @@ type KaspadMessage struct {
// *KaspadMessage_PruningPointUTXOSetOverrideNotification
// *KaspadMessage_StopNotifyingPruningPointUTXOSetOverrideRequest
// *KaspadMessage_StopNotifyingPruningPointUTXOSetOverrideResponse
+ // *KaspadMessage_EstimateNetworkHashesPerSecondRequest
+ // *KaspadMessage_EstimateNetworkHashesPerSecondResponse
Payload isKaspadMessage_Payload `protobuf_oneof:"payload"`
}
@@ -897,6 +899,20 @@ func (x *KaspadMessage) GetStopNotifyingPruningPointUTXOSetOverrideResponse() *S
return nil
}
+func (x *KaspadMessage) GetEstimateNetworkHashesPerSecondRequest() *EstimateNetworkHashesPerSecondRequestMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_EstimateNetworkHashesPerSecondRequest); ok {
+ return x.EstimateNetworkHashesPerSecondRequest
+ }
+ return nil
+}
+
+func (x *KaspadMessage) GetEstimateNetworkHashesPerSecondResponse() *EstimateNetworkHashesPerSecondResponseMessage {
+ if x, ok := x.GetPayload().(*KaspadMessage_EstimateNetworkHashesPerSecondResponse); ok {
+ return x.EstimateNetworkHashesPerSecondResponse
+ }
+ return nil
+}
+
type isKaspadMessage_Payload interface {
isKaspadMessage_Payload()
}
@@ -1313,6 +1329,14 @@ type KaspadMessage_StopNotifyingPruningPointUTXOSetOverrideResponse struct {
StopNotifyingPruningPointUTXOSetOverrideResponse *StopNotifyingPruningPointUTXOSetOverrideResponseMessage `protobuf:"bytes,1071,opt,name=stopNotifyingPruningPointUTXOSetOverrideResponse,proto3,oneof"`
}
+type KaspadMessage_EstimateNetworkHashesPerSecondRequest struct {
+ EstimateNetworkHashesPerSecondRequest *EstimateNetworkHashesPerSecondRequestMessage `protobuf:"bytes,1072,opt,name=estimateNetworkHashesPerSecondRequest,proto3,oneof"`
+}
+
+type KaspadMessage_EstimateNetworkHashesPerSecondResponse struct {
+ EstimateNetworkHashesPerSecondResponse *EstimateNetworkHashesPerSecondResponseMessage `protobuf:"bytes,1073,opt,name=estimateNetworkHashesPerSecondResponse,proto3,oneof"`
+}
+
func (*KaspadMessage_Addresses) isKaspadMessage_Payload() {}
func (*KaspadMessage_Block) isKaspadMessage_Payload() {}
@@ -1519,13 +1543,17 @@ func (*KaspadMessage_StopNotifyingPruningPointUTXOSetOverrideRequest) isKaspadMe
func (*KaspadMessage_StopNotifyingPruningPointUTXOSetOverrideResponse) isKaspadMessage_Payload() {}
+func (*KaspadMessage_EstimateNetworkHashesPerSecondRequest) isKaspadMessage_Payload() {}
+
+func (*KaspadMessage_EstimateNetworkHashesPerSecondResponse) isKaspadMessage_Payload() {}
+
var File_messages_proto protoreflect.FileDescriptor
var file_messages_proto_rawDesc = []byte{
0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x12, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x1a, 0x09, 0x70, 0x32, 0x70,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74,
- 0x6f, 0x22, 0xa4, 0x55, 0x0a, 0x0d, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73,
+ 0x6f, 0x22, 0xcd, 0x57, 0x0a, 0x0d, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73,
0x61, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73,
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
0x72, 0x65, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4d, 0x65, 0x73, 0x73,
@@ -2206,21 +2234,40 @@ var file_messages_proto_rawDesc = []byte{
0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x30, 0x73, 0x74, 0x6f,
0x70, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e,
0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x54, 0x58, 0x4f, 0x53, 0x65, 0x74, 0x4f, 0x76, 0x65,
- 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x09, 0x0a,
- 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x32, 0x50, 0x0a, 0x03, 0x50, 0x32, 0x50, 0x12,
- 0x49, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
- 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73,
- 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73,
- 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x32, 0x50, 0x0a, 0x03, 0x52, 0x50,
- 0x43, 0x12, 0x49, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65,
- 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b,
- 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x26, 0x5a, 0x24,
- 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61,
- 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x77, 0x69, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x90, 0x01,
+ 0x0a, 0x25, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,
+ 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xb0, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d,
+ 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73,
+ 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x25, 0x65, 0x73, 0x74, 0x69, 0x6d,
+ 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73,
+ 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x12, 0x93, 0x01, 0x0a, 0x26, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74,
+ 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63,
+ 0x6f, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xb1, 0x08, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x45,
+ 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61,
+ 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x26,
+ 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48,
+ 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61,
+ 0x64, 0x32, 0x50, 0x0a, 0x03, 0x50, 0x32, 0x50, 0x12, 0x49, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e,
+ 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28,
+ 0x01, 0x30, 0x01, 0x32, 0x50, 0x0a, 0x03, 0x52, 0x50, 0x43, 0x12, 0x49, 0x0a, 0x0d, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
+ 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
+ 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
+ 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61, 0x73,
+ 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x62, 0x06, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -2340,6 +2387,8 @@ var file_messages_proto_goTypes = []interface{}{
(*PruningPointUTXOSetOverrideNotificationMessage)(nil), // 100: protowire.PruningPointUTXOSetOverrideNotificationMessage
(*StopNotifyingPruningPointUTXOSetOverrideRequestMessage)(nil), // 101: protowire.StopNotifyingPruningPointUTXOSetOverrideRequestMessage
(*StopNotifyingPruningPointUTXOSetOverrideResponseMessage)(nil), // 102: protowire.StopNotifyingPruningPointUTXOSetOverrideResponseMessage
+ (*EstimateNetworkHashesPerSecondRequestMessage)(nil), // 103: protowire.EstimateNetworkHashesPerSecondRequestMessage
+ (*EstimateNetworkHashesPerSecondResponseMessage)(nil), // 104: protowire.EstimateNetworkHashesPerSecondResponseMessage
}
var file_messages_proto_depIdxs = []int32{
1, // 0: protowire.KaspadMessage.addresses:type_name -> protowire.AddressesMessage
@@ -2445,15 +2494,17 @@ var file_messages_proto_depIdxs = []int32{
100, // 100: protowire.KaspadMessage.pruningPointUTXOSetOverrideNotification:type_name -> protowire.PruningPointUTXOSetOverrideNotificationMessage
101, // 101: protowire.KaspadMessage.stopNotifyingPruningPointUTXOSetOverrideRequest:type_name -> protowire.StopNotifyingPruningPointUTXOSetOverrideRequestMessage
102, // 102: protowire.KaspadMessage.stopNotifyingPruningPointUTXOSetOverrideResponse:type_name -> protowire.StopNotifyingPruningPointUTXOSetOverrideResponseMessage
- 0, // 103: protowire.P2P.MessageStream:input_type -> protowire.KaspadMessage
- 0, // 104: protowire.RPC.MessageStream:input_type -> protowire.KaspadMessage
- 0, // 105: protowire.P2P.MessageStream:output_type -> protowire.KaspadMessage
- 0, // 106: protowire.RPC.MessageStream:output_type -> protowire.KaspadMessage
- 105, // [105:107] is the sub-list for method output_type
- 103, // [103:105] is the sub-list for method input_type
- 103, // [103:103] is the sub-list for extension type_name
- 103, // [103:103] is the sub-list for extension extendee
- 0, // [0:103] is the sub-list for field type_name
+ 103, // 103: protowire.KaspadMessage.estimateNetworkHashesPerSecondRequest:type_name -> protowire.EstimateNetworkHashesPerSecondRequestMessage
+ 104, // 104: protowire.KaspadMessage.estimateNetworkHashesPerSecondResponse:type_name -> protowire.EstimateNetworkHashesPerSecondResponseMessage
+ 0, // 105: protowire.P2P.MessageStream:input_type -> protowire.KaspadMessage
+ 0, // 106: protowire.RPC.MessageStream:input_type -> protowire.KaspadMessage
+ 0, // 107: protowire.P2P.MessageStream:output_type -> protowire.KaspadMessage
+ 0, // 108: protowire.RPC.MessageStream:output_type -> protowire.KaspadMessage
+ 107, // [107:109] is the sub-list for method output_type
+ 105, // [105:107] is the sub-list for method input_type
+ 105, // [105:105] is the sub-list for extension type_name
+ 105, // [105:105] is the sub-list for extension extendee
+ 0, // [0:105] is the sub-list for field type_name
}
func init() { file_messages_proto_init() }
@@ -2581,6 +2632,8 @@ func file_messages_proto_init() {
(*KaspadMessage_PruningPointUTXOSetOverrideNotification)(nil),
(*KaspadMessage_StopNotifyingPruningPointUTXOSetOverrideRequest)(nil),
(*KaspadMessage_StopNotifyingPruningPointUTXOSetOverrideResponse)(nil),
+ (*KaspadMessage_EstimateNetworkHashesPerSecondRequest)(nil),
+ (*KaspadMessage_EstimateNetworkHashesPerSecondResponse)(nil),
}
type x struct{}
out := protoimpl.TypeBuilder{
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto
index 43f1f7290..421a65180 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/messages.proto
@@ -112,6 +112,8 @@ message KaspadMessage {
PruningPointUTXOSetOverrideNotificationMessage pruningPointUTXOSetOverrideNotification = 1069;
StopNotifyingPruningPointUTXOSetOverrideRequestMessage stopNotifyingPruningPointUTXOSetOverrideRequest = 1070;
StopNotifyingPruningPointUTXOSetOverrideResponseMessage stopNotifyingPruningPointUTXOSetOverrideResponse = 1071;
+ EstimateNetworkHashesPerSecondRequestMessage estimateNetworkHashesPerSecondRequest = 1072;
+ EstimateNetworkHashesPerSecondResponseMessage estimateNetworkHashesPerSecondResponse = 1073;
}
}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.md b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.md
index 0ceda4cd6..8f8a135c8 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.md
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.md
@@ -5,11 +5,21 @@
- [rpc.proto](#rpc.proto)
- [RPCError](#protowire.RPCError)
+ - [RpcBlock](#protowire.RpcBlock)
+ - [RpcBlockHeader](#protowire.RpcBlockHeader)
+ - [RpcBlockVerboseData](#protowire.RpcBlockVerboseData)
+ - [RpcTransaction](#protowire.RpcTransaction)
+ - [RpcTransactionInput](#protowire.RpcTransactionInput)
+ - [RpcScriptPublicKey](#protowire.RpcScriptPublicKey)
+ - [RpcTransactionOutput](#protowire.RpcTransactionOutput)
+ - [RpcOutpoint](#protowire.RpcOutpoint)
+ - [RpcUtxoEntry](#protowire.RpcUtxoEntry)
+ - [RpcTransactionVerboseData](#protowire.RpcTransactionVerboseData)
+ - [RpcTransactionInputVerboseData](#protowire.RpcTransactionInputVerboseData)
+ - [RpcTransactionOutputVerboseData](#protowire.RpcTransactionOutputVerboseData)
- [GetCurrentNetworkRequestMessage](#protowire.GetCurrentNetworkRequestMessage)
- [GetCurrentNetworkResponseMessage](#protowire.GetCurrentNetworkResponseMessage)
- [SubmitBlockRequestMessage](#protowire.SubmitBlockRequestMessage)
- - [RpcBlock](#protowire.RpcBlock)
- - [RpcBlockHeader](#protowire.RpcBlockHeader)
- [SubmitBlockResponseMessage](#protowire.SubmitBlockResponseMessage)
- [GetBlockTemplateRequestMessage](#protowire.GetBlockTemplateRequestMessage)
- [GetBlockTemplateResponseMessage](#protowire.GetBlockTemplateResponseMessage)
@@ -30,20 +40,16 @@
- [GetConnectedPeerInfoResponseMessage](#protowire.GetConnectedPeerInfoResponseMessage)
- [GetConnectedPeerInfoMessage](#protowire.GetConnectedPeerInfoMessage)
- [AddPeerRequestMessage](#protowire.AddPeerRequestMessage)
- - [AddPeerResponseMessage](#protowire.AddPeerResponseMessage)
- - [SubmitTransactionRequestMessage](#protowire.SubmitTransactionRequestMessage)
- - [SubmitTransactionResponseMessage](#protowire.SubmitTransactionResponseMessage)
- - [NotifyVirtualSelectedParentChainChangedRequestMessage](#protowire.NotifyVirtualSelectedParentChainChangedRequestMessage)
- - [NotifyVirtualSelectedParentChainChangedResponseMessage](#protowire.NotifyVirtualSelectedParentChainChangedResponseMessage)
- - [VirtualSelectedParentChainChangedNotificationMessage](#protowire.VirtualSelectedParentChainChangedNotificationMessage)
- - [ChainBlock](#protowire.ChainBlock)
- - [AcceptedBlock](#protowire.AcceptedBlock)
- - [GetBlockRequestMessage](#protowire.GetBlockRequestMessage)
- - [GetBlockResponseMessage](#protowire.GetBlockResponseMessage)
- - [BlockVerboseData](#protowire.BlockVerboseData)
- - [TransactionVerboseData](#protowire.TransactionVerboseData)
- - [TransactionVerboseInput](#protowire.TransactionVerboseInput)
- - [TransactionVerboseOutput](#protowire.TransactionVerboseOutput)
+ - [AddPeerResponseMessage](#protowire.AddPeerResponseMessage)
+ - [SubmitTransactionRequestMessage](#protowire.SubmitTransactionRequestMessage)
+ - [SubmitTransactionResponseMessage](#protowire.SubmitTransactionResponseMessage)
+ - [NotifyVirtualSelectedParentChainChangedRequestMessage](#protowire.NotifyVirtualSelectedParentChainChangedRequestMessage)
+ - [NotifyVirtualSelectedParentChainChangedResponseMessage](#protowire.NotifyVirtualSelectedParentChainChangedResponseMessage)
+ - [VirtualSelectedParentChainChangedNotificationMessage](#protowire.VirtualSelectedParentChainChangedNotificationMessage)
+ - [ChainBlock](#protowire.ChainBlock)
+ - [AcceptedBlock](#protowire.AcceptedBlock)
+ - [GetBlockRequestMessage](#protowire.GetBlockRequestMessage)
+ - [GetBlockResponseMessage](#protowire.GetBlockResponseMessage)
- [GetSubnetworkRequestMessage](#protowire.GetSubnetworkRequestMessage)
- [GetSubnetworkResponseMessage](#protowire.GetSubnetworkResponseMessage)
- [GetVirtualSelectedParentChainFromBlockRequestMessage](#protowire.GetVirtualSelectedParentChainFromBlockRequestMessage)
@@ -70,12 +76,6 @@
- [UtxosByAddressesEntry](#protowire.UtxosByAddressesEntry)
- [StopNotifyingUtxosChangedRequestMessage](#protowire.StopNotifyingUtxosChangedRequestMessage)
- [StopNotifyingUtxosChangedResponseMessage](#protowire.StopNotifyingUtxosChangedResponseMessage)
- - [RpcTransaction](#protowire.RpcTransaction)
- - [RpcTransactionInput](#protowire.RpcTransactionInput)
- - [RpcScriptPublicKey](#protowire.RpcScriptPublicKey)
- - [RpcTransactionOutput](#protowire.RpcTransactionOutput)
- - [RpcOutpoint](#protowire.RpcOutpoint)
- - [RpcUtxoEntry](#protowire.RpcUtxoEntry)
- [GetUtxosByAddressesRequestMessage](#protowire.GetUtxosByAddressesRequestMessage)
- [GetUtxosByAddressesResponseMessage](#protowire.GetUtxosByAddressesResponseMessage)
- [GetVirtualSelectedParentBlueScoreRequestMessage](#protowire.GetVirtualSelectedParentBlueScoreRequestMessage)
@@ -84,18 +84,20 @@
- [NotifyVirtualSelectedParentBlueScoreChangedResponseMessage](#protowire.NotifyVirtualSelectedParentBlueScoreChangedResponseMessage)
- [VirtualSelectedParentBlueScoreChangedNotificationMessage](#protowire.VirtualSelectedParentBlueScoreChangedNotificationMessage)
- [NotifyPruningPointUTXOSetOverrideRequestMessage](#protowire.NotifyPruningPointUTXOSetOverrideRequestMessage)
- - [NotifyPruningPointUTXOSetOverrideResponseMessage](#protowire.NotifyPruningPointUTXOSetOverrideResponseMessage)
- - [PruningPointUTXOSetOverrideNotificationMessage](#protowire.PruningPointUTXOSetOverrideNotificationMessage)
- - [StopNotifyingPruningPointUTXOSetOverrideRequestMessage](#protowire.StopNotifyingPruningPointUTXOSetOverrideRequestMessage)
- - [StopNotifyingPruningPointUTXOSetOverrideResponseMessage](#protowire.StopNotifyingPruningPointUTXOSetOverrideResponseMessage)
- - [BanRequestMessage](#protowire.BanRequestMessage)
- - [BanResponseMessage](#protowire.BanResponseMessage)
- - [UnbanRequestMessage](#protowire.UnbanRequestMessage)
- - [UnbanResponseMessage](#protowire.UnbanResponseMessage)
- - [GetInfoRequestMessage](#protowire.GetInfoRequestMessage)
- - [GetInfoResponseMessage](#protowire.GetInfoResponseMessage)
-
- - [SubmitBlockResponseMessage.RejectReason](#protowire.SubmitBlockResponseMessage.RejectReason)
+ - [NotifyPruningPointUTXOSetOverrideResponseMessage](#protowire.NotifyPruningPointUTXOSetOverrideResponseMessage)
+ - [PruningPointUTXOSetOverrideNotificationMessage](#protowire.PruningPointUTXOSetOverrideNotificationMessage)
+ - [StopNotifyingPruningPointUTXOSetOverrideRequestMessage](#protowire.StopNotifyingPruningPointUTXOSetOverrideRequestMessage)
+ - [StopNotifyingPruningPointUTXOSetOverrideResponseMessage](#protowire.StopNotifyingPruningPointUTXOSetOverrideResponseMessage)
+ - [BanRequestMessage](#protowire.BanRequestMessage)
+ - [BanResponseMessage](#protowire.BanResponseMessage)
+ - [UnbanRequestMessage](#protowire.UnbanRequestMessage)
+ - [UnbanResponseMessage](#protowire.UnbanResponseMessage)
+ - [GetInfoRequestMessage](#protowire.GetInfoRequestMessage)
+ - [GetInfoResponseMessage](#protowire.GetInfoResponseMessage)
+ - [EstimateNetworkHashesPerSecondRequestMessage](#protowire.EstimateNetworkHashesPerSecondRequestMessage)
+ - [EstimateNetworkHashesPerSecondResponseMessage](#protowire.EstimateNetworkHashesPerSecondResponseMessage)
+
+ - [SubmitBlockResponseMessage.RejectReason](#protowire.SubmitBlockResponseMessage.RejectReason)
- [Scalar Value Types](#scalar-value-types)
@@ -127,52 +129,6 @@ Receivers of any ResponseMessage are expected to check whether its error field i
| ----- | ---- | ----- | ----------- |
| message | [string](#string) | | |
-
-
-
-
-
-
-
-### GetCurrentNetworkRequestMessage
-GetCurrentNetworkRequestMessage requests the network kaspad is currently running against.
-
-Possible networks are: Mainnet, Testnet, Simnet, Devnet
-
-
-
-
-
-
-
-
-### GetCurrentNetworkResponseMessage
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| currentNetwork | [string](#string) | | |
-| error | [RPCError](#protowire.RPCError) | | |
-
-
-
-
-
-
-
-
-### SubmitBlockRequestMessage
-
-SubmitBlockRequestMessage requests to submit a block into the DAG. Blocks are generally expected to have been generated
-using the getBlockTemplate call.
-
-See: GetBlockTemplateRequestMessage
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| block | [RpcBlock](#protowire.RpcBlock) | | |
-
### RpcBlock
@@ -181,6 +137,7 @@ See: GetBlockTemplateRequestMessage
| ----- | ---- | ----- | ----------- |
| header | [RpcBlockHeader](#protowire.RpcBlockHeader) | | |
| transactions | [RpcTransaction](#protowire.RpcTransaction) | repeated | |
+| verboseData | [RpcBlockVerboseData](#protowire.RpcBlockVerboseData) | | |
@@ -197,6 +154,140 @@ See: GetBlockTemplateRequestMessage
| bits | [uint32](#uint32) | | |
| nonce | [uint64](#uint64) | | |
+
+
+### RpcBlockVerboseData
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| hash | [string](#string) | | |
+| difficulty | [double](#double) | | |
+| selectedParentHash | [string](#string) | | |
+| transactionIds | [string](#string) | repeated | |
+| isHeaderOnly | [bool](#bool) | | |
+| blueScore | [uint64](#uint64) | | |
+| childrenHashes | [string](#string) | repeated | |
+
+
+
+### RpcTransaction
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| version | [uint32](#uint32) | | |
+| inputs | [RpcTransactionInput](#protowire.RpcTransactionInput) | repeated | |
+| outputs | [RpcTransactionOutput](#protowire.RpcTransactionOutput) | repeated | |
+| lockTime | [uint64](#uint64) | | |
+| subnetworkId | [string](#string) | | |
+| gas | [uint64](#uint64) | | |
+| payload | [string](#string) | | |
+| verboseData | [RpcTransactionVerboseData](#protowire.RpcTransactionVerboseData) | | |
+
+
+
+### RpcTransactionInput
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| previousOutpoint | [RpcOutpoint](#protowire.RpcOutpoint) | | |
+| signatureScript | [string](#string) | | |
+| sequence | [uint64](#uint64) | | |
+| verboseData | [RpcTransactionInputVerboseData](#protowire.RpcTransactionInputVerboseData) | | |
+
+
+
+### RpcScriptPublicKey
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| version | [uint32](#uint32) | | |
+| scriptPublicKey | [string](#string) | | |
+
+
+
+### RpcTransactionOutput
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| amount | [uint64](#uint64) | | |
+| scriptPublicKey | [RpcScriptPublicKey](#protowire.RpcScriptPublicKey) | | |
+| verboseData | [RpcTransactionOutputVerboseData](#protowire.RpcTransactionOutputVerboseData) | | |
+
+
+
+### RpcOutpoint
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| transactionId | [string](#string) | | |
+| index | [uint32](#uint32) | | |
+
+
+
+### RpcUtxoEntry
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| amount | [uint64](#uint64) | | |
+| scriptPublicKey | [RpcScriptPublicKey](#protowire.RpcScriptPublicKey) | | |
+| blockDaaScore | [uint64](#uint64) | | |
+| isCoinbase | [bool](#bool) | | |
+
+
+
+### RpcTransactionVerboseData
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| transactionId | [string](#string) | | |
+| hash | [string](#string) | | |
+| size | [uint64](#uint64) | | |
+| blockHash | [string](#string) | | |
+| blockTime | [uint64](#uint64) | | |
+
+
+
+### RpcTransactionInputVerboseData
+
+
+
+### RpcTransactionOutputVerboseData
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| scriptPublicKeyType | [string](#string) | | |
+| scriptPublicKeyAddress | [string](#string) | | |
+
+
+
+### GetCurrentNetworkRequestMessage
+
+GetCurrentNetworkRequestMessage requests the network kaspad is currently running against.
+
+Possible networks are: Mainnet, Testnet, Simnet, Devnet
+
+
+
+### GetCurrentNetworkResponseMessage
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| currentNetwork | [string](#string) | | |
+| error | [RPCError](#protowire.RPCError) | | |
+
+
+
+### SubmitBlockRequestMessage
+
+SubmitBlockRequestMessage requests to submit a block into the DAG. Blocks are generally expected to have been generated
+using the getBlockTemplate call.
+
+See: GetBlockTemplateRequestMessage
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| block | [RpcBlock](#protowire.RpcBlock) | | |
+
### SubmitBlockResponseMessage
@@ -284,7 +375,7 @@ See: NotifyBlockAddedRequestMessage
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
-| blockVerboseData | [BlockVerboseData](#protowire.BlockVerboseData) | | |
+| block | [RpcBlock](#protowire.RpcBlock) | | |
@@ -429,7 +520,7 @@ currently in the mempool.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| fee | [uint64](#uint64) | | |
-| transactionVerboseData | [TransactionVerboseData](#protowire.TransactionVerboseData) | | |
+| transaction | [RpcTransaction](#protowire.RpcTransaction) | | |
@@ -651,78 +742,8 @@ GetBlockRequestMessage requests information about a specific block
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
-| blockHash | [string](#string) | | |
-| blockVerboseData | [BlockVerboseData](#protowire.BlockVerboseData) | | |
-| error | [RPCError](#protowire.RPCError) | | |
-
-
-
-
-
-
-
-
-### BlockVerboseData
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| hash | [string](#string) | | |
| block | [RpcBlock](#protowire.RpcBlock) | | |
-| transactionVerboseData | [TransactionVerboseData](#protowire.TransactionVerboseData) | repeated | |
-| difficulty | [double](#double) | | |
-| childrenHashes | [string](#string) | repeated | |
-| selectedParentHash | [string](#string) | | |
-| transactionIDs | [string](#string) | repeated | |
-| isHeaderOnly | [bool](#bool) | | |
-| blueScore | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### TransactionVerboseData
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| txId | [string](#string) | | |
-| hash | [string](#string) | | |
-| size | [uint64](#uint64) | | |
-| transactionVerboseInputs | [TransactionVerboseInput](#protowire.TransactionVerboseInput) | repeated | |
-| transactionVerboseOutputs | [TransactionVerboseOutput](#protowire.TransactionVerboseOutput) | repeated | |
-| blockHash | [string](#string) | | |
-| blockTime | [uint64](#uint64) | | |
-| transaction | [RpcTransaction](#protowire.RpcTransaction) | | |
-
-
-
-
-
-
-
-
-### TransactionVerboseInput
-
-
-
-
-
-
-
-
-
-### TransactionVerboseOutput
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| scriptPublicKeyType | [string](#string) | | |
-| scriptPublicKeyAddress | [string](#string) | | |
+| error | [RPCError](#protowire.RPCError) | | |
@@ -805,7 +826,7 @@ kaspad's current virtual.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| lowHash | [string](#string) | | |
-| includeBlockVerboseData | [bool](#bool) | | |
+| includeBlocks | [bool](#bool) | | |
| includeTransactionVerboseData | [bool](#bool) | | |
@@ -822,7 +843,7 @@ kaspad's current virtual.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| blockHashes | [string](#string) | repeated | |
-| blockVerboseData | [BlockVerboseData](#protowire.BlockVerboseData) | repeated | |
+| blocks | [RpcBlock](#protowire.RpcBlock) | repeated | |
| error | [RPCError](#protowire.RPCError) | | |
@@ -1141,110 +1162,6 @@ See: UtxosChangedNotificationMessage
-
-
-### RpcTransaction
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| version | [uint32](#uint32) | | |
-| inputs | [RpcTransactionInput](#protowire.RpcTransactionInput) | repeated | |
-| outputs | [RpcTransactionOutput](#protowire.RpcTransactionOutput) | repeated | |
-| lockTime | [uint64](#uint64) | | |
-| subnetworkId | [string](#string) | | |
-| gas | [uint64](#uint64) | | |
-| payload | [string](#string) | | |
-
-
-
-
-
-
-
-
-### RpcTransactionInput
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| previousOutpoint | [RpcOutpoint](#protowire.RpcOutpoint) | | |
-| signatureScript | [string](#string) | | |
-| sequence | [uint64](#uint64) | | |
-
-
-
-
-
-
-
-
-### RpcScriptPublicKey
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| version | [uint32](#uint32) | | |
-| scriptPublicKey | [string](#string) | | |
-
-
-
-
-
-
-
-
-### RpcTransactionOutput
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| amount | [uint64](#uint64) | | |
-| scriptPublicKey | [RpcScriptPublicKey](#protowire.RpcScriptPublicKey) | | |
-
-
-
-
-
-
-
-
-### RpcOutpoint
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| transactionId | [string](#string) | | |
-| index | [uint32](#uint32) | | |
-
-
-
-
-
-
-
-
-### RpcUtxoEntry
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| amount | [uint64](#uint64) | | |
-| scriptPublicKey | [RpcScriptPublicKey](#protowire.RpcScriptPublicKey) | | |
-| blockDaaScore | [uint64](#uint64) | | |
-| isCoinbase | [bool](#bool) | | |
-
-
-
-
-
-
### GetUtxosByAddressesRequestMessage
@@ -1498,26 +1415,33 @@ GetInfoRequestMessage returns info about the node.
### GetInfoResponseMessage
-
-
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| p2pId | [string](#string) | | |
| mempoolSize | [uint64](#uint64) | | |
| error | [RPCError](#protowire.RPCError) | | |
+
+### EstimateNetworkHashesPerSecondRequestMessage
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| windowSize | [uint32](#uint32) | | |
+
-
+### EstimateNetworkHashesPerSecondResponseMessage
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| networkHashesPerSecond | [uint64](#uint64) | | |
+| error | [RPCError](#protowire.RPCError) | | |
### SubmitBlockResponseMessage.RejectReason
-
| Name | Number | Description |
| ---- | ------ | ----------- |
| NONE | 0 | |
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.pb.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.pb.go
index 9260a6603..07b3bc711 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.pb.go
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.pb.go
@@ -4994,6 +4994,108 @@ func (x *GetInfoResponseMessage) GetError() *RPCError {
return nil
}
+type EstimateNetworkHashesPerSecondRequestMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ WindowSize uint32 `protobuf:"varint,1,opt,name=windowSize,proto3" json:"windowSize,omitempty"`
+}
+
+func (x *EstimateNetworkHashesPerSecondRequestMessage) Reset() {
+ *x = EstimateNetworkHashesPerSecondRequestMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[90]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EstimateNetworkHashesPerSecondRequestMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EstimateNetworkHashesPerSecondRequestMessage) ProtoMessage() {}
+
+func (x *EstimateNetworkHashesPerSecondRequestMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[90]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EstimateNetworkHashesPerSecondRequestMessage.ProtoReflect.Descriptor instead.
+func (*EstimateNetworkHashesPerSecondRequestMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{90}
+}
+
+func (x *EstimateNetworkHashesPerSecondRequestMessage) GetWindowSize() uint32 {
+ if x != nil {
+ return x.WindowSize
+ }
+ return 0
+}
+
+type EstimateNetworkHashesPerSecondResponseMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ NetworkHashesPerSecond uint64 `protobuf:"varint,1,opt,name=networkHashesPerSecond,proto3" json:"networkHashesPerSecond,omitempty"`
+ Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
+}
+
+func (x *EstimateNetworkHashesPerSecondResponseMessage) Reset() {
+ *x = EstimateNetworkHashesPerSecondResponseMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_rpc_proto_msgTypes[91]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EstimateNetworkHashesPerSecondResponseMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EstimateNetworkHashesPerSecondResponseMessage) ProtoMessage() {}
+
+func (x *EstimateNetworkHashesPerSecondResponseMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_rpc_proto_msgTypes[91]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EstimateNetworkHashesPerSecondResponseMessage.ProtoReflect.Descriptor instead.
+func (*EstimateNetworkHashesPerSecondResponseMessage) Descriptor() ([]byte, []int) {
+ return file_rpc_proto_rawDescGZIP(), []int{91}
+}
+
+func (x *EstimateNetworkHashesPerSecondResponseMessage) GetNetworkHashesPerSecond() uint64 {
+ if x != nil {
+ return x.NetworkHashesPerSecond
+ }
+ return 0
+}
+
+func (x *EstimateNetworkHashesPerSecondResponseMessage) GetError() *RPCError {
+ if x != nil {
+ return x.Error
+ }
+ return nil
+}
+
var File_rpc_proto protoreflect.FileDescriptor
var file_rpc_proto_rawDesc = []byte{
@@ -5617,10 +5719,24 @@ var file_rpc_proto_rawDesc = []byte{
0x04, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2a,
0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72,
- 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69,
- 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65,
- 0x74, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69,
- 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x2c, 0x45, 0x73,
+ 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73,
+ 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x77, 0x69,
+ 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a,
+ 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x2d, 0x45,
+ 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61,
+ 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x16,
+ 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72,
+ 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x6e, 0x65,
+ 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65,
+ 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xe8, 0x07,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65,
+ 0x2e, 0x52, 0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72,
+ 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b,
+ 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -5636,7 +5752,7 @@ func file_rpc_proto_rawDescGZIP() []byte {
}
var file_rpc_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_rpc_proto_msgTypes = make([]protoimpl.MessageInfo, 90)
+var file_rpc_proto_msgTypes = make([]protoimpl.MessageInfo, 92)
var file_rpc_proto_goTypes = []interface{}{
(SubmitBlockResponseMessage_RejectReason)(0), // 0: protowire.SubmitBlockResponseMessage.RejectReason
(*RPCError)(nil), // 1: protowire.RPCError
@@ -5729,6 +5845,8 @@ var file_rpc_proto_goTypes = []interface{}{
(*UnbanResponseMessage)(nil), // 88: protowire.UnbanResponseMessage
(*GetInfoRequestMessage)(nil), // 89: protowire.GetInfoRequestMessage
(*GetInfoResponseMessage)(nil), // 90: protowire.GetInfoResponseMessage
+ (*EstimateNetworkHashesPerSecondRequestMessage)(nil), // 91: protowire.EstimateNetworkHashesPerSecondRequestMessage
+ (*EstimateNetworkHashesPerSecondResponseMessage)(nil), // 92: protowire.EstimateNetworkHashesPerSecondResponseMessage
}
var file_rpc_proto_depIdxs = []int32{
3, // 0: protowire.RpcBlock.header:type_name -> protowire.RpcBlockHeader
@@ -5795,11 +5913,12 @@ var file_rpc_proto_depIdxs = []int32{
1, // 61: protowire.BanResponseMessage.error:type_name -> protowire.RPCError
1, // 62: protowire.UnbanResponseMessage.error:type_name -> protowire.RPCError
1, // 63: protowire.GetInfoResponseMessage.error:type_name -> protowire.RPCError
- 64, // [64:64] is the sub-list for method output_type
- 64, // [64:64] is the sub-list for method input_type
- 64, // [64:64] is the sub-list for extension type_name
- 64, // [64:64] is the sub-list for extension extendee
- 0, // [0:64] is the sub-list for field type_name
+ 1, // 64: protowire.EstimateNetworkHashesPerSecondResponseMessage.error:type_name -> protowire.RPCError
+ 65, // [65:65] is the sub-list for method output_type
+ 65, // [65:65] is the sub-list for method input_type
+ 65, // [65:65] is the sub-list for extension type_name
+ 65, // [65:65] is the sub-list for extension extendee
+ 0, // [0:65] is the sub-list for field type_name
}
func init() { file_rpc_proto_init() }
@@ -6888,6 +7007,30 @@ func file_rpc_proto_init() {
return nil
}
}
+ file_rpc_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EstimateNetworkHashesPerSecondRequestMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_rpc_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EstimateNetworkHashesPerSecondResponseMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
}
type x struct{}
out := protoimpl.TypeBuilder{
@@ -6895,7 +7038,7 @@ func file_rpc_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_rpc_proto_rawDesc,
NumEnums: 1,
- NumMessages: 90,
+ NumMessages: 92,
NumExtensions: 0,
NumServices: 0,
},
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.proto b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.proto
index 041b10a5e..70ccd9774 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.proto
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc.proto
@@ -588,3 +588,14 @@ message GetInfoResponseMessage{
uint64 mempoolSize = 2;
RPCError error = 1000;
}
+
+message EstimateNetworkHashesPerSecondRequestMessage{
+ uint32 windowSize = 1;
+}
+
+message EstimateNetworkHashesPerSecondResponseMessage{
+ uint64 networkHashesPerSecond = 1;
+ RPCError error = 1000;
+}
+
+
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_estimate_network_hashes_per_second.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_estimate_network_hashes_per_second.go
new file mode 100644
index 000000000..8b3a22b46
--- /dev/null
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_estimate_network_hashes_per_second.go
@@ -0,0 +1,68 @@
+package protowire
+
+import (
+ "github.com/kaspanet/kaspad/app/appmessage"
+ "github.com/pkg/errors"
+)
+
+func (x *KaspadMessage_EstimateNetworkHashesPerSecondRequest) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_EstimateNetworkHashesPerSecondRequest is nil")
+ }
+ return x.EstimateNetworkHashesPerSecondRequest.toAppMessage()
+}
+
+func (x *KaspadMessage_EstimateNetworkHashesPerSecondRequest) fromAppMessage(message *appmessage.EstimateNetworkHashesPerSecondRequestMessage) error {
+ x.EstimateNetworkHashesPerSecondRequest = &EstimateNetworkHashesPerSecondRequestMessage{
+ WindowSize: message.WindowSize,
+ }
+ return nil
+}
+
+func (x *EstimateNetworkHashesPerSecondRequestMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "EstimateNetworkHashesPerSecondRequestMessage is nil")
+ }
+ return &appmessage.EstimateNetworkHashesPerSecondRequestMessage{
+ WindowSize: x.WindowSize,
+ }, nil
+}
+
+func (x *KaspadMessage_EstimateNetworkHashesPerSecondResponse) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "KaspadMessage_EstimateNetworkHashesPerSecondResponse is nil")
+ }
+ return x.EstimateNetworkHashesPerSecondResponse.toAppMessage()
+}
+
+func (x *KaspadMessage_EstimateNetworkHashesPerSecondResponse) fromAppMessage(message *appmessage.EstimateNetworkHashesPerSecondResponseMessage) error {
+ var err *RPCError
+ if message.Error != nil {
+ err = &RPCError{Message: message.Error.Message}
+ }
+ x.EstimateNetworkHashesPerSecondResponse = &EstimateNetworkHashesPerSecondResponseMessage{
+ NetworkHashesPerSecond: message.NetworkHashesPerSecond,
+ Error: err,
+ }
+ return nil
+}
+
+func (x *EstimateNetworkHashesPerSecondResponseMessage) toAppMessage() (appmessage.Message, error) {
+ if x == nil {
+ return nil, errors.Wrapf(errorNil, "EstimateNetworkHashesPerSecondResponseMessage is nil")
+ }
+ rpcErr, err := x.Error.toAppMessage()
+ // Error is an optional field
+ if err != nil && !errors.Is(err, errorNil) {
+ return nil, err
+ }
+
+ if rpcErr != nil && x.NetworkHashesPerSecond != 0 {
+ return nil, errors.New("EstimateNetworkHashesPerSecondResponseMessage contains both an error and a response")
+ }
+
+ return &appmessage.EstimateNetworkHashesPerSecondResponseMessage{
+ NetworkHashesPerSecond: x.NetworkHashesPerSecond,
+ Error: rpcErr,
+ }, nil
+}
diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go b/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go
index b6ac2f064..51f312664 100644
--- a/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go
+++ b/infrastructure/network/netadapter/server/grpcserver/protowire/wire.go
@@ -779,6 +779,20 @@ func toRPCPayload(message appmessage.Message) (isKaspadMessage_Payload, error) {
return nil, err
}
return payload, nil
+ case *appmessage.EstimateNetworkHashesPerSecondRequestMessage:
+ payload := new(KaspadMessage_EstimateNetworkHashesPerSecondRequest)
+ err := payload.fromAppMessage(message)
+ if err != nil {
+ return nil, err
+ }
+ return payload, nil
+ case *appmessage.EstimateNetworkHashesPerSecondResponseMessage:
+ payload := new(KaspadMessage_EstimateNetworkHashesPerSecondResponse)
+ err := payload.fromAppMessage(message)
+ if err != nil {
+ return nil, err
+ }
+ return payload, nil
default:
return nil, nil
}
diff --git a/infrastructure/network/rpcclient/rpc_estimate_network_hashes_per_second.go b/infrastructure/network/rpcclient/rpc_estimate_network_hashes_per_second.go
new file mode 100644
index 000000000..1776aba31
--- /dev/null
+++ b/infrastructure/network/rpcclient/rpc_estimate_network_hashes_per_second.go
@@ -0,0 +1,20 @@
+package rpcclient
+
+import "github.com/kaspanet/kaspad/app/appmessage"
+
+// EstimateNetworkHashesPerSecond sends an RPC request respective to the function's name and returns the RPC server's response
+func (c *RPCClient) EstimateNetworkHashesPerSecond(windowSize uint32) (*appmessage.EstimateNetworkHashesPerSecondResponseMessage, error) {
+ err := c.rpcRouter.outgoingRoute().Enqueue(appmessage.NewEstimateNetworkHashesPerSecondRequestMessage(windowSize))
+ if err != nil {
+ return nil, err
+ }
+ response, err := c.route(appmessage.CmdEstimateNetworkHashesPerSecondResponseMessage).DequeueWithTimeout(c.timeout)
+ if err != nil {
+ return nil, err
+ }
+ estimateNetworkHashesPerSecondResponse := response.(*appmessage.EstimateNetworkHashesPerSecondResponseMessage)
+ if estimateNetworkHashesPerSecondResponse.Error != nil {
+ return nil, c.convertRPCError(estimateNetworkHashesPerSecondResponse.Error)
+ }
+ return estimateNetworkHashesPerSecondResponse, nil
+}