mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-06-06 14:16:43 +00:00
Optimize the miner-kaspad flow and latency (#1988)
* protobuf for new block template notification structs * appmessage and wire for new block template notification structs * Set up the entire handler/call-chain for managing the new-block-template event
This commit is contained in:
parent
2eca0f0b5f
commit
c4a034eb43
@ -156,6 +156,9 @@ const (
|
|||||||
CmdVirtualDaaScoreChangedNotificationMessage
|
CmdVirtualDaaScoreChangedNotificationMessage
|
||||||
CmdGetBalancesByAddressesRequestMessage
|
CmdGetBalancesByAddressesRequestMessage
|
||||||
CmdGetBalancesByAddressesResponseMessage
|
CmdGetBalancesByAddressesResponseMessage
|
||||||
|
CmdNotifyNewBlockTemplateRequestMessage
|
||||||
|
CmdNotifyNewBlockTemplateResponseMessage
|
||||||
|
CmdNewBlockTemplateNotificationMessage
|
||||||
)
|
)
|
||||||
|
|
||||||
// ProtocolMessageCommandToString maps all MessageCommands to their string representation
|
// ProtocolMessageCommandToString maps all MessageCommands to their string representation
|
||||||
@ -286,6 +289,9 @@ var RPCMessageCommandToString = map[MessageCommand]string{
|
|||||||
CmdVirtualDaaScoreChangedNotificationMessage: "VirtualDaaScoreChangedNotification",
|
CmdVirtualDaaScoreChangedNotificationMessage: "VirtualDaaScoreChangedNotification",
|
||||||
CmdGetBalancesByAddressesRequestMessage: "GetBalancesByAddressesRequest",
|
CmdGetBalancesByAddressesRequestMessage: "GetBalancesByAddressesRequest",
|
||||||
CmdGetBalancesByAddressesResponseMessage: "GetBalancesByAddressesResponse",
|
CmdGetBalancesByAddressesResponseMessage: "GetBalancesByAddressesResponse",
|
||||||
|
CmdNotifyNewBlockTemplateRequestMessage: "NotifyNewBlockTemplateRequest",
|
||||||
|
CmdNotifyNewBlockTemplateResponseMessage: "NotifyNewBlockTemplateResponse",
|
||||||
|
CmdNewBlockTemplateNotificationMessage: "NewBlockTemplateNotification",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Message is an interface that describes a kaspa message. A type that
|
// Message is an interface that describes a kaspa message. A type that
|
||||||
|
50
app/appmessage/rpc_notify_new_block_template.go
Normal file
50
app/appmessage/rpc_notify_new_block_template.go
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package appmessage
|
||||||
|
|
||||||
|
// NotifyNewBlockTemplateRequestMessage is an appmessage corresponding to
|
||||||
|
// its respective RPC message
|
||||||
|
type NotifyNewBlockTemplateRequestMessage struct {
|
||||||
|
baseMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
// Command returns the protocol command string for the message
|
||||||
|
func (msg *NotifyNewBlockTemplateRequestMessage) Command() MessageCommand {
|
||||||
|
return CmdNotifyNewBlockTemplateRequestMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewNotifyNewBlockTemplateRequestMessage returns an instance of the message
|
||||||
|
func NewNotifyNewBlockTemplateRequestMessage() *NotifyNewBlockTemplateRequestMessage {
|
||||||
|
return &NotifyNewBlockTemplateRequestMessage{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotifyNewBlockTemplateResponseMessage is an appmessage corresponding to
|
||||||
|
// its respective RPC message
|
||||||
|
type NotifyNewBlockTemplateResponseMessage struct {
|
||||||
|
baseMessage
|
||||||
|
Error *RPCError
|
||||||
|
}
|
||||||
|
|
||||||
|
// Command returns the protocol command string for the message
|
||||||
|
func (msg *NotifyNewBlockTemplateResponseMessage) Command() MessageCommand {
|
||||||
|
return CmdNotifyNewBlockTemplateResponseMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewNotifyNewBlockTemplateResponseMessage returns an instance of the message
|
||||||
|
func NewNotifyNewBlockTemplateResponseMessage() *NotifyNewBlockTemplateResponseMessage {
|
||||||
|
return &NotifyNewBlockTemplateResponseMessage{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBlockTemplateNotificationMessage is an appmessage corresponding to
|
||||||
|
// its respective RPC message
|
||||||
|
type NewBlockTemplateNotificationMessage struct {
|
||||||
|
baseMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
// Command returns the protocol command string for the message
|
||||||
|
func (msg *NewBlockTemplateNotificationMessage) Command() MessageCommand {
|
||||||
|
return CmdNewBlockTemplateNotificationMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewNewBlockTemplateNotificationMessage returns an instance of the message
|
||||||
|
func NewNewBlockTemplateNotificationMessage() *NewBlockTemplateNotificationMessage {
|
||||||
|
return &NewBlockTemplateNotificationMessage{}
|
||||||
|
}
|
@ -153,6 +153,7 @@ func setupRPC(
|
|||||||
shutDownChan,
|
shutDownChan,
|
||||||
)
|
)
|
||||||
protocolManager.SetOnVirtualChange(rpcManager.NotifyVirtualChange)
|
protocolManager.SetOnVirtualChange(rpcManager.NotifyVirtualChange)
|
||||||
|
protocolManager.SetOnNewBlockTemplateHandler(rpcManager.NotifyNewBlockTemplate)
|
||||||
protocolManager.SetOnBlockAddedToDAGHandler(rpcManager.NotifyBlockAddedToDAG)
|
protocolManager.SetOnBlockAddedToDAGHandler(rpcManager.NotifyBlockAddedToDAG)
|
||||||
protocolManager.SetOnPruningPointUTXOSetOverrideHandler(rpcManager.NotifyPruningPointUTXOSetOverride)
|
protocolManager.SetOnPruningPointUTXOSetOverrideHandler(rpcManager.NotifyPruningPointUTXOSetOverride)
|
||||||
|
|
||||||
|
@ -68,6 +68,15 @@ func (f *FlowContext) OnVirtualChange(virtualChangeSet *externalapi.VirtualChang
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OnNewBlockTemplate calls the handler function whenever a new block template is available for miners.
|
||||||
|
func (f *FlowContext) OnNewBlockTemplate() error {
|
||||||
|
if f.onNewBlockTemplateHandler != nil {
|
||||||
|
return f.onNewBlockTemplateHandler()
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// OnPruningPointUTXOSetOverride calls the handler function whenever the UTXO set
|
// OnPruningPointUTXOSetOverride calls the handler function whenever the UTXO set
|
||||||
// resets due to pruning point change via IBD.
|
// resets due to pruning point change via IBD.
|
||||||
func (f *FlowContext) OnPruningPointUTXOSetOverride() error {
|
func (f *FlowContext) OnPruningPointUTXOSetOverride() error {
|
||||||
@ -125,6 +134,10 @@ func (f *FlowContext) AddBlock(block *externalapi.DomainBlock) error {
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
err = f.OnNewBlockTemplate()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
err = f.OnNewBlock(block, virtualChangeSet)
|
err = f.OnNewBlock(block, virtualChangeSet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -25,6 +25,9 @@ type OnBlockAddedToDAGHandler func(block *externalapi.DomainBlock, virtualChange
|
|||||||
// OnVirtualChangeHandler is a handler function that's triggered when the virtual changes
|
// OnVirtualChangeHandler is a handler function that's triggered when the virtual changes
|
||||||
type OnVirtualChangeHandler func(virtualChangeSet *externalapi.VirtualChangeSet) error
|
type OnVirtualChangeHandler func(virtualChangeSet *externalapi.VirtualChangeSet) error
|
||||||
|
|
||||||
|
// OnNewBlockTemplateHandler is a handler function that's triggered when a new block template is available
|
||||||
|
type OnNewBlockTemplateHandler func() error
|
||||||
|
|
||||||
// OnPruningPointUTXOSetOverrideHandler is a handle function that's triggered whenever the UTXO set
|
// OnPruningPointUTXOSetOverrideHandler is a handle function that's triggered whenever the UTXO set
|
||||||
// resets due to pruning point change via IBD.
|
// resets due to pruning point change via IBD.
|
||||||
type OnPruningPointUTXOSetOverrideHandler func() error
|
type OnPruningPointUTXOSetOverrideHandler func() error
|
||||||
@ -46,6 +49,7 @@ type FlowContext struct {
|
|||||||
|
|
||||||
onVirtualChangeHandler OnVirtualChangeHandler
|
onVirtualChangeHandler OnVirtualChangeHandler
|
||||||
onBlockAddedToDAGHandler OnBlockAddedToDAGHandler
|
onBlockAddedToDAGHandler OnBlockAddedToDAGHandler
|
||||||
|
onNewBlockTemplateHandler OnNewBlockTemplateHandler
|
||||||
onPruningPointUTXOSetOverrideHandler OnPruningPointUTXOSetOverrideHandler
|
onPruningPointUTXOSetOverrideHandler OnPruningPointUTXOSetOverrideHandler
|
||||||
onTransactionAddedToMempoolHandler OnTransactionAddedToMempoolHandler
|
onTransactionAddedToMempoolHandler OnTransactionAddedToMempoolHandler
|
||||||
|
|
||||||
@ -112,6 +116,11 @@ func (f *FlowContext) SetOnBlockAddedToDAGHandler(onBlockAddedToDAGHandler OnBlo
|
|||||||
f.onBlockAddedToDAGHandler = onBlockAddedToDAGHandler
|
f.onBlockAddedToDAGHandler = onBlockAddedToDAGHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetOnNewBlockTemplateHandler sets the onNewBlockTemplateHandler handler
|
||||||
|
func (f *FlowContext) SetOnNewBlockTemplateHandler(onNewBlockTemplateHandler OnNewBlockTemplateHandler) {
|
||||||
|
f.onNewBlockTemplateHandler = onNewBlockTemplateHandler
|
||||||
|
}
|
||||||
|
|
||||||
// SetOnPruningPointUTXOSetOverrideHandler sets the onPruningPointUTXOSetOverrideHandler handler
|
// SetOnPruningPointUTXOSetOverrideHandler sets the onPruningPointUTXOSetOverrideHandler handler
|
||||||
func (f *FlowContext) SetOnPruningPointUTXOSetOverrideHandler(onPruningPointUTXOSetOverrideHandler OnPruningPointUTXOSetOverrideHandler) {
|
func (f *FlowContext) SetOnPruningPointUTXOSetOverrideHandler(onPruningPointUTXOSetOverrideHandler OnPruningPointUTXOSetOverrideHandler) {
|
||||||
f.onPruningPointUTXOSetOverrideHandler = onPruningPointUTXOSetOverrideHandler
|
f.onPruningPointUTXOSetOverrideHandler = onPruningPointUTXOSetOverrideHandler
|
||||||
|
@ -27,6 +27,7 @@ type RelayInvsContext interface {
|
|||||||
Config() *config.Config
|
Config() *config.Config
|
||||||
OnNewBlock(block *externalapi.DomainBlock, virtualChangeSet *externalapi.VirtualChangeSet) error
|
OnNewBlock(block *externalapi.DomainBlock, virtualChangeSet *externalapi.VirtualChangeSet) error
|
||||||
OnVirtualChange(virtualChangeSet *externalapi.VirtualChangeSet) error
|
OnVirtualChange(virtualChangeSet *externalapi.VirtualChangeSet) error
|
||||||
|
OnNewBlockTemplate() error
|
||||||
OnPruningPointUTXOSetOverride() error
|
OnPruningPointUTXOSetOverride() error
|
||||||
SharedRequestedBlocks() *flowcontext.SharedRequestedBlocks
|
SharedRequestedBlocks() *flowcontext.SharedRequestedBlocks
|
||||||
Broadcast(message appmessage.Message) error
|
Broadcast(message appmessage.Message) error
|
||||||
@ -168,11 +169,12 @@ func (flow *handleRelayInvsFlow) start() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtualHasNewParents := false
|
||||||
for _, parent := range newVirtualInfo.ParentHashes {
|
for _, parent := range newVirtualInfo.ParentHashes {
|
||||||
if oldVirtualParents.Contains(parent) {
|
if oldVirtualParents.Contains(parent) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
virtualHasNewParents = true
|
||||||
block, err := flow.Domain().Consensus().GetBlock(parent)
|
block, err := flow.Domain().Consensus().GetBlock(parent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -185,6 +187,14 @@ func (flow *handleRelayInvsFlow) start() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if virtualHasNewParents {
|
||||||
|
log.Debugf("Virtual %d has new parents, raising new block template event", newVirtualInfo.DAAScore)
|
||||||
|
err = flow.OnNewBlockTemplate()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log.Infof("Accepted block %s via relay", inv.Hash)
|
log.Infof("Accepted block %s via relay", inv.Hash)
|
||||||
err = flow.OnNewBlock(block, virtualChangeSet)
|
err = flow.OnNewBlock(block, virtualChangeSet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -25,6 +25,7 @@ type IBDContext interface {
|
|||||||
Config() *config.Config
|
Config() *config.Config
|
||||||
OnNewBlock(block *externalapi.DomainBlock, virtualChangeSet *externalapi.VirtualChangeSet) error
|
OnNewBlock(block *externalapi.DomainBlock, virtualChangeSet *externalapi.VirtualChangeSet) error
|
||||||
OnVirtualChange(virtualChangeSet *externalapi.VirtualChangeSet) error
|
OnVirtualChange(virtualChangeSet *externalapi.VirtualChangeSet) error
|
||||||
|
OnNewBlockTemplate() error
|
||||||
OnPruningPointUTXOSetOverride() error
|
OnPruningPointUTXOSetOverride() error
|
||||||
IsIBDRunning() bool
|
IsIBDRunning() bool
|
||||||
TrySetIBDRunning(ibdPeer *peerpkg.Peer) bool
|
TrySetIBDRunning(ibdPeer *peerpkg.Peer) bool
|
||||||
@ -639,6 +640,10 @@ func (flow *handleIBDFlow) resolveVirtual(estimatedVirtualDAAScoreTarget uint64)
|
|||||||
|
|
||||||
if isCompletelyResolved {
|
if isCompletelyResolved {
|
||||||
log.Infof("Resolved virtual")
|
log.Infof("Resolved virtual")
|
||||||
|
err = flow.OnNewBlockTemplate()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ type RelayInvsContext interface {
|
|||||||
Config() *config.Config
|
Config() *config.Config
|
||||||
OnNewBlock(block *externalapi.DomainBlock, virtualChangeSet *externalapi.VirtualChangeSet) error
|
OnNewBlock(block *externalapi.DomainBlock, virtualChangeSet *externalapi.VirtualChangeSet) error
|
||||||
OnVirtualChange(virtualChangeSet *externalapi.VirtualChangeSet) error
|
OnVirtualChange(virtualChangeSet *externalapi.VirtualChangeSet) error
|
||||||
|
OnNewBlockTemplate() error
|
||||||
OnPruningPointUTXOSetOverride() error
|
OnPruningPointUTXOSetOverride() error
|
||||||
SharedRequestedBlocks() *flowcontext.SharedRequestedBlocks
|
SharedRequestedBlocks() *flowcontext.SharedRequestedBlocks
|
||||||
Broadcast(message appmessage.Message) error
|
Broadcast(message appmessage.Message) error
|
||||||
@ -168,11 +169,12 @@ func (flow *handleRelayInvsFlow) start() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtualHasNewParents := false
|
||||||
for _, parent := range newVirtualInfo.ParentHashes {
|
for _, parent := range newVirtualInfo.ParentHashes {
|
||||||
if oldVirtualParents.Contains(parent) {
|
if oldVirtualParents.Contains(parent) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
virtualHasNewParents = true
|
||||||
block, err := flow.Domain().Consensus().GetBlock(parent)
|
block, err := flow.Domain().Consensus().GetBlock(parent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -185,6 +187,14 @@ func (flow *handleRelayInvsFlow) start() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if virtualHasNewParents {
|
||||||
|
log.Debugf("Virtual %d has new parents, raising new block template event", newVirtualInfo.DAAScore)
|
||||||
|
err = flow.OnNewBlockTemplate()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log.Infof("Accepted block %s via relay", inv.Hash)
|
log.Infof("Accepted block %s via relay", inv.Hash)
|
||||||
err = flow.OnNewBlock(block, virtualChangeSet)
|
err = flow.OnNewBlock(block, virtualChangeSet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -22,6 +22,7 @@ type IBDContext interface {
|
|||||||
Config() *config.Config
|
Config() *config.Config
|
||||||
OnNewBlock(block *externalapi.DomainBlock, virtualChangeSet *externalapi.VirtualChangeSet) error
|
OnNewBlock(block *externalapi.DomainBlock, virtualChangeSet *externalapi.VirtualChangeSet) error
|
||||||
OnVirtualChange(virtualChangeSet *externalapi.VirtualChangeSet) error
|
OnVirtualChange(virtualChangeSet *externalapi.VirtualChangeSet) error
|
||||||
|
OnNewBlockTemplate() error
|
||||||
OnPruningPointUTXOSetOverride() error
|
OnPruningPointUTXOSetOverride() error
|
||||||
IsIBDRunning() bool
|
IsIBDRunning() bool
|
||||||
TrySetIBDRunning(ibdPeer *peerpkg.Peer) bool
|
TrySetIBDRunning(ibdPeer *peerpkg.Peer) bool
|
||||||
@ -717,6 +718,10 @@ func (flow *handleIBDFlow) resolveVirtual(estimatedVirtualDAAScoreTarget uint64)
|
|||||||
|
|
||||||
if isCompletelyResolved {
|
if isCompletelyResolved {
|
||||||
log.Infof("Resolved virtual")
|
log.Infof("Resolved virtual")
|
||||||
|
err = flow.OnNewBlockTemplate()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,6 +100,11 @@ func (m *Manager) SetOnBlockAddedToDAGHandler(onBlockAddedToDAGHandler flowconte
|
|||||||
m.context.SetOnBlockAddedToDAGHandler(onBlockAddedToDAGHandler)
|
m.context.SetOnBlockAddedToDAGHandler(onBlockAddedToDAGHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetOnNewBlockTemplateHandler sets the onNewBlockTemplate handler
|
||||||
|
func (m *Manager) SetOnNewBlockTemplateHandler(onNewBlockTemplateHandler flowcontext.OnNewBlockTemplateHandler) {
|
||||||
|
m.context.SetOnNewBlockTemplateHandler(onNewBlockTemplateHandler)
|
||||||
|
}
|
||||||
|
|
||||||
// SetOnPruningPointUTXOSetOverrideHandler sets the OnPruningPointUTXOSetOverride handler
|
// SetOnPruningPointUTXOSetOverrideHandler sets the OnPruningPointUTXOSetOverride handler
|
||||||
func (m *Manager) SetOnPruningPointUTXOSetOverrideHandler(onPruningPointUTXOSetOverrideHandler flowcontext.OnPruningPointUTXOSetOverrideHandler) {
|
func (m *Manager) SetOnPruningPointUTXOSetOverrideHandler(onPruningPointUTXOSetOverrideHandler flowcontext.OnPruningPointUTXOSetOverrideHandler) {
|
||||||
m.context.SetOnPruningPointUTXOSetOverrideHandler(onPruningPointUTXOSetOverrideHandler)
|
m.context.SetOnPruningPointUTXOSetOverrideHandler(onPruningPointUTXOSetOverrideHandler)
|
||||||
|
@ -96,6 +96,13 @@ func (m *Manager) NotifyVirtualChange(virtualChangeSet *externalapi.VirtualChang
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotifyNewBlockTemplate notifies the manager that a new
|
||||||
|
// block template is available for miners
|
||||||
|
func (m *Manager) NotifyNewBlockTemplate() error {
|
||||||
|
notification := appmessage.NewNewBlockTemplateNotificationMessage()
|
||||||
|
return m.context.NotificationManager.NotifyNewBlockTemplate(notification)
|
||||||
|
}
|
||||||
|
|
||||||
// NotifyPruningPointUTXOSetOverride notifies the manager whenever the UTXO index
|
// NotifyPruningPointUTXOSetOverride notifies the manager whenever the UTXO index
|
||||||
// resets due to pruning point change via IBD.
|
// resets due to pruning point change via IBD.
|
||||||
func (m *Manager) NotifyPruningPointUTXOSetOverride() error {
|
func (m *Manager) NotifyPruningPointUTXOSetOverride() error {
|
||||||
|
@ -48,6 +48,7 @@ var handlers = map[appmessage.MessageCommand]handler{
|
|||||||
appmessage.CmdStopNotifyingPruningPointUTXOSetOverrideRequestMessage: rpchandlers.HandleStopNotifyingPruningPointUTXOSetOverrideRequest,
|
appmessage.CmdStopNotifyingPruningPointUTXOSetOverrideRequestMessage: rpchandlers.HandleStopNotifyingPruningPointUTXOSetOverrideRequest,
|
||||||
appmessage.CmdEstimateNetworkHashesPerSecondRequestMessage: rpchandlers.HandleEstimateNetworkHashesPerSecond,
|
appmessage.CmdEstimateNetworkHashesPerSecondRequestMessage: rpchandlers.HandleEstimateNetworkHashesPerSecond,
|
||||||
appmessage.CmdNotifyVirtualDaaScoreChangedRequestMessage: rpchandlers.HandleNotifyVirtualDaaScoreChanged,
|
appmessage.CmdNotifyVirtualDaaScoreChangedRequestMessage: rpchandlers.HandleNotifyVirtualDaaScoreChanged,
|
||||||
|
appmessage.CmdNotifyNewBlockTemplateRequestMessage: rpchandlers.HandleNotifyNewBlockTemplate,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) routerInitializer(router *router.Router, netConnection *netadapter.NetConnection) {
|
func (m *Manager) routerInitializer(router *router.Router, netConnection *netadapter.NetConnection) {
|
||||||
|
@ -32,6 +32,7 @@ type NotificationListener struct {
|
|||||||
propagateVirtualSelectedParentBlueScoreChangedNotifications bool
|
propagateVirtualSelectedParentBlueScoreChangedNotifications bool
|
||||||
propagateVirtualDaaScoreChangedNotifications bool
|
propagateVirtualDaaScoreChangedNotifications bool
|
||||||
propagatePruningPointUTXOSetOverrideNotifications bool
|
propagatePruningPointUTXOSetOverrideNotifications bool
|
||||||
|
propagateNewBlockTemplateNotifications bool
|
||||||
|
|
||||||
propagateUTXOsChangedNotificationAddresses map[utxoindex.ScriptPublicKeyString]*UTXOsChangedNotificationAddress
|
propagateUTXOsChangedNotificationAddresses map[utxoindex.ScriptPublicKeyString]*UTXOsChangedNotificationAddress
|
||||||
}
|
}
|
||||||
@ -201,6 +202,25 @@ func (nm *NotificationManager) NotifyVirtualDaaScoreChanged(
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotifyNewBlockTemplate notifies the notification manager that a new
|
||||||
|
// block template is available for miners
|
||||||
|
func (nm *NotificationManager) NotifyNewBlockTemplate(
|
||||||
|
notification *appmessage.NewBlockTemplateNotificationMessage) error {
|
||||||
|
|
||||||
|
nm.RLock()
|
||||||
|
defer nm.RUnlock()
|
||||||
|
|
||||||
|
for router, listener := range nm.listeners {
|
||||||
|
if listener.propagateNewBlockTemplateNotifications {
|
||||||
|
err := router.OutgoingRoute().Enqueue(notification)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// NotifyPruningPointUTXOSetOverride notifies the notification manager that the UTXO index
|
// NotifyPruningPointUTXOSetOverride notifies the notification manager that the UTXO index
|
||||||
// reset due to pruning point change via IBD.
|
// reset due to pruning point change via IBD.
|
||||||
func (nm *NotificationManager) NotifyPruningPointUTXOSetOverride() error {
|
func (nm *NotificationManager) NotifyPruningPointUTXOSetOverride() error {
|
||||||
@ -226,6 +246,7 @@ func newNotificationListener() *NotificationListener {
|
|||||||
propagateFinalityConflictResolvedNotifications: false,
|
propagateFinalityConflictResolvedNotifications: false,
|
||||||
propagateUTXOsChangedNotifications: false,
|
propagateUTXOsChangedNotifications: false,
|
||||||
propagateVirtualSelectedParentBlueScoreChangedNotifications: false,
|
propagateVirtualSelectedParentBlueScoreChangedNotifications: false,
|
||||||
|
propagateNewBlockTemplateNotifications: false,
|
||||||
propagatePruningPointUTXOSetOverrideNotifications: false,
|
propagatePruningPointUTXOSetOverrideNotifications: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -334,6 +355,12 @@ func (nl *NotificationListener) PropagateVirtualDaaScoreChangedNotifications() {
|
|||||||
nl.propagateVirtualDaaScoreChangedNotifications = true
|
nl.propagateVirtualDaaScoreChangedNotifications = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PropagateNewBlockTemplateNotifications instructs the listener to send
|
||||||
|
// new block template notifications to the remote listener
|
||||||
|
func (nl *NotificationListener) PropagateNewBlockTemplateNotifications() {
|
||||||
|
nl.propagateNewBlockTemplateNotifications = true
|
||||||
|
}
|
||||||
|
|
||||||
// PropagatePruningPointUTXOSetOverrideNotifications instructs the listener to send pruning point UTXO set override notifications
|
// PropagatePruningPointUTXOSetOverrideNotifications instructs the listener to send pruning point UTXO set override notifications
|
||||||
// to the remote listener.
|
// to the remote listener.
|
||||||
func (nl *NotificationListener) PropagatePruningPointUTXOSetOverrideNotifications() {
|
func (nl *NotificationListener) PropagatePruningPointUTXOSetOverrideNotifications() {
|
||||||
|
19
app/rpc/rpchandlers/notify_new_block_template.go
Normal file
19
app/rpc/rpchandlers/notify_new_block_template.go
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package rpchandlers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/kaspanet/kaspad/app/appmessage"
|
||||||
|
"github.com/kaspanet/kaspad/app/rpc/rpccontext"
|
||||||
|
"github.com/kaspanet/kaspad/infrastructure/network/netadapter/router"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HandleNotifyNewBlockTemplate handles the respectively named RPC command
|
||||||
|
func HandleNotifyNewBlockTemplate(context *rpccontext.Context, router *router.Router, _ appmessage.Message) (appmessage.Message, error) {
|
||||||
|
listener, err := context.NotificationManager.Listener(router)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
listener.PropagateNewBlockTemplateNotifications()
|
||||||
|
|
||||||
|
response := appmessage.NewNotifyNewBlockTemplateResponseMessage()
|
||||||
|
return response, nil
|
||||||
|
}
|
@ -13,8 +13,8 @@ const minerTimeout = 10 * time.Second
|
|||||||
type minerClient struct {
|
type minerClient struct {
|
||||||
*rpcclient.RPCClient
|
*rpcclient.RPCClient
|
||||||
|
|
||||||
cfg *configFlags
|
cfg *configFlags
|
||||||
blockAddedNotificationChan chan struct{}
|
newBlockTemplateNotificationChan chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mc *minerClient) connect() error {
|
func (mc *minerClient) connect() error {
|
||||||
@ -30,14 +30,14 @@ func (mc *minerClient) connect() error {
|
|||||||
mc.SetTimeout(minerTimeout)
|
mc.SetTimeout(minerTimeout)
|
||||||
mc.SetLogger(backendLog, logger.LevelTrace)
|
mc.SetLogger(backendLog, logger.LevelTrace)
|
||||||
|
|
||||||
err = mc.RegisterForBlockAddedNotifications(func(_ *appmessage.BlockAddedNotificationMessage) {
|
err = mc.RegisterForNewBlockTemplateNotifications(func(_ *appmessage.NewBlockTemplateNotificationMessage) {
|
||||||
select {
|
select {
|
||||||
case mc.blockAddedNotificationChan <- struct{}{}:
|
case mc.newBlockTemplateNotificationChan <- struct{}{}:
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "error requesting block-added notifications")
|
return errors.Wrapf(err, "error requesting new-block-template notifications")
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("Connected to %s", rpcAddress)
|
log.Infof("Connected to %s", rpcAddress)
|
||||||
@ -47,8 +47,8 @@ func (mc *minerClient) connect() error {
|
|||||||
|
|
||||||
func newMinerClient(cfg *configFlags) (*minerClient, error) {
|
func newMinerClient(cfg *configFlags) (*minerClient, error) {
|
||||||
minerClient := &minerClient{
|
minerClient := &minerClient{
|
||||||
cfg: cfg,
|
cfg: cfg,
|
||||||
blockAddedNotificationChan: make(chan struct{}),
|
newBlockTemplateNotificationChan: make(chan struct{}),
|
||||||
}
|
}
|
||||||
|
|
||||||
err := minerClient.connect()
|
err := minerClient.connect()
|
||||||
|
@ -217,7 +217,7 @@ func templatesLoop(client *minerClient, miningAddr util.Address, errChan chan er
|
|||||||
ticker := time.NewTicker(tickerTime)
|
ticker := time.NewTicker(tickerTime)
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-client.blockAddedNotificationChan:
|
case <-client.newBlockTemplateNotificationChan:
|
||||||
getBlockTemplate()
|
getBlockTemplate()
|
||||||
ticker.Reset(tickerTime)
|
ticker.Reset(tickerTime)
|
||||||
case <-ticker.C:
|
case <-ticker.C:
|
||||||
|
@ -149,6 +149,9 @@ type KaspadMessage struct {
|
|||||||
// *KaspadMessage_GetBalanceByAddressResponse
|
// *KaspadMessage_GetBalanceByAddressResponse
|
||||||
// *KaspadMessage_GetBalancesByAddressesRequest
|
// *KaspadMessage_GetBalancesByAddressesRequest
|
||||||
// *KaspadMessage_GetBalancesByAddressesResponse
|
// *KaspadMessage_GetBalancesByAddressesResponse
|
||||||
|
// *KaspadMessage_NotifyNewBlockTemplateRequest
|
||||||
|
// *KaspadMessage_NotifyNewBlockTemplateResponse
|
||||||
|
// *KaspadMessage_NewBlockTemplateNotification
|
||||||
Payload isKaspadMessage_Payload `protobuf_oneof:"payload"`
|
Payload isKaspadMessage_Payload `protobuf_oneof:"payload"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1052,6 +1055,27 @@ func (x *KaspadMessage) GetGetBalancesByAddressesResponse() *GetBalancesByAddres
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *KaspadMessage) GetNotifyNewBlockTemplateRequest() *NotifyNewBlockTemplateRequestMessage {
|
||||||
|
if x, ok := x.GetPayload().(*KaspadMessage_NotifyNewBlockTemplateRequest); ok {
|
||||||
|
return x.NotifyNewBlockTemplateRequest
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KaspadMessage) GetNotifyNewBlockTemplateResponse() *NotifyNewBlockTemplateResponseMessage {
|
||||||
|
if x, ok := x.GetPayload().(*KaspadMessage_NotifyNewBlockTemplateResponse); ok {
|
||||||
|
return x.NotifyNewBlockTemplateResponse
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KaspadMessage) GetNewBlockTemplateNotification() *NewBlockTemplateNotificationMessage {
|
||||||
|
if x, ok := x.GetPayload().(*KaspadMessage_NewBlockTemplateNotification); ok {
|
||||||
|
return x.NewBlockTemplateNotification
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type isKaspadMessage_Payload interface {
|
type isKaspadMessage_Payload interface {
|
||||||
isKaspadMessage_Payload()
|
isKaspadMessage_Payload()
|
||||||
}
|
}
|
||||||
@ -1548,6 +1572,18 @@ type KaspadMessage_GetBalancesByAddressesResponse struct {
|
|||||||
GetBalancesByAddressesResponse *GetBalancesByAddressesResponseMessage `protobuf:"bytes,1080,opt,name=getBalancesByAddressesResponse,proto3,oneof"`
|
GetBalancesByAddressesResponse *GetBalancesByAddressesResponseMessage `protobuf:"bytes,1080,opt,name=getBalancesByAddressesResponse,proto3,oneof"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type KaspadMessage_NotifyNewBlockTemplateRequest struct {
|
||||||
|
NotifyNewBlockTemplateRequest *NotifyNewBlockTemplateRequestMessage `protobuf:"bytes,1081,opt,name=notifyNewBlockTemplateRequest,proto3,oneof"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type KaspadMessage_NotifyNewBlockTemplateResponse struct {
|
||||||
|
NotifyNewBlockTemplateResponse *NotifyNewBlockTemplateResponseMessage `protobuf:"bytes,1082,opt,name=notifyNewBlockTemplateResponse,proto3,oneof"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type KaspadMessage_NewBlockTemplateNotification struct {
|
||||||
|
NewBlockTemplateNotification *NewBlockTemplateNotificationMessage `protobuf:"bytes,1083,opt,name=newBlockTemplateNotification,proto3,oneof"`
|
||||||
|
}
|
||||||
|
|
||||||
func (*KaspadMessage_Addresses) isKaspadMessage_Payload() {}
|
func (*KaspadMessage_Addresses) isKaspadMessage_Payload() {}
|
||||||
|
|
||||||
func (*KaspadMessage_Block) isKaspadMessage_Payload() {}
|
func (*KaspadMessage_Block) isKaspadMessage_Payload() {}
|
||||||
@ -1794,13 +1830,19 @@ func (*KaspadMessage_GetBalancesByAddressesRequest) isKaspadMessage_Payload() {}
|
|||||||
|
|
||||||
func (*KaspadMessage_GetBalancesByAddressesResponse) isKaspadMessage_Payload() {}
|
func (*KaspadMessage_GetBalancesByAddressesResponse) isKaspadMessage_Payload() {}
|
||||||
|
|
||||||
|
func (*KaspadMessage_NotifyNewBlockTemplateRequest) isKaspadMessage_Payload() {}
|
||||||
|
|
||||||
|
func (*KaspadMessage_NotifyNewBlockTemplateResponse) isKaspadMessage_Payload() {}
|
||||||
|
|
||||||
|
func (*KaspadMessage_NewBlockTemplateNotification) isKaspadMessage_Payload() {}
|
||||||
|
|
||||||
var File_messages_proto protoreflect.FileDescriptor
|
var File_messages_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
var file_messages_proto_rawDesc = []byte{
|
var file_messages_proto_rawDesc = []byte{
|
||||||
0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
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,
|
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,
|
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
||||||
0x6f, 0x22, 0xf3, 0x66, 0x0a, 0x0d, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73,
|
0x6f, 0x22, 0xe1, 0x69, 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,
|
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,
|
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,
|
0x72, 0x65, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x4d, 0x65, 0x73, 0x73,
|
||||||
@ -2622,21 +2664,44 @@ var file_messages_proto_rawDesc = []byte{
|
|||||||
0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
||||||
0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x67, 0x65,
|
0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1e, 0x67, 0x65,
|
||||||
0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65,
|
0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65,
|
||||||
0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x09, 0x0a, 0x07,
|
0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x1d,
|
||||||
0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x32, 0x50, 0x0a, 0x03, 0x50, 0x32, 0x50, 0x12, 0x49,
|
0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65,
|
||||||
|
0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xb9, 0x08,
|
||||||
|
0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65,
|
||||||
|
0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54,
|
||||||
|
0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65,
|
||||||
|
0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4e,
|
||||||
|
0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52,
|
||||||
|
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x7b, 0x0a, 0x1e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79,
|
||||||
|
0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
|
||||||
|
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0xba, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
|
0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x69,
|
||||||
|
0x66, 0x79, 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
|
||||||
|
0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
||||||
|
0x65, 0x48, 0x00, 0x52, 0x1e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4e, 0x65, 0x77, 0x42, 0x6c,
|
||||||
|
0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
||||||
|
0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x1c, 0x6e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54,
|
||||||
|
0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
|
||||||
|
0x69, 0x6f, 0x6e, 0x18, 0xbb, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f,
|
||||||
|
0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54,
|
||||||
|
0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
|
||||||
|
0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1c, 0x6e, 0x65,
|
||||||
|
0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x6f,
|
||||||
|
0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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,
|
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,
|
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,
|
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,
|
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,
|
0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74,
|
||||||
0x12, 0x49, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61,
|
0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74,
|
||||||
0x6d, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61,
|
0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72,
|
||||||
0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, 0x72,
|
0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
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 (
|
var (
|
||||||
@ -2776,6 +2841,9 @@ var file_messages_proto_goTypes = []interface{}{
|
|||||||
(*GetBalanceByAddressResponseMessage)(nil), // 120: protowire.GetBalanceByAddressResponseMessage
|
(*GetBalanceByAddressResponseMessage)(nil), // 120: protowire.GetBalanceByAddressResponseMessage
|
||||||
(*GetBalancesByAddressesRequestMessage)(nil), // 121: protowire.GetBalancesByAddressesRequestMessage
|
(*GetBalancesByAddressesRequestMessage)(nil), // 121: protowire.GetBalancesByAddressesRequestMessage
|
||||||
(*GetBalancesByAddressesResponseMessage)(nil), // 122: protowire.GetBalancesByAddressesResponseMessage
|
(*GetBalancesByAddressesResponseMessage)(nil), // 122: protowire.GetBalancesByAddressesResponseMessage
|
||||||
|
(*NotifyNewBlockTemplateRequestMessage)(nil), // 123: protowire.NotifyNewBlockTemplateRequestMessage
|
||||||
|
(*NotifyNewBlockTemplateResponseMessage)(nil), // 124: protowire.NotifyNewBlockTemplateResponseMessage
|
||||||
|
(*NewBlockTemplateNotificationMessage)(nil), // 125: protowire.NewBlockTemplateNotificationMessage
|
||||||
}
|
}
|
||||||
var file_messages_proto_depIdxs = []int32{
|
var file_messages_proto_depIdxs = []int32{
|
||||||
1, // 0: protowire.KaspadMessage.addresses:type_name -> protowire.AddressesMessage
|
1, // 0: protowire.KaspadMessage.addresses:type_name -> protowire.AddressesMessage
|
||||||
@ -2901,15 +2969,18 @@ var file_messages_proto_depIdxs = []int32{
|
|||||||
120, // 120: protowire.KaspadMessage.getBalanceByAddressResponse:type_name -> protowire.GetBalanceByAddressResponseMessage
|
120, // 120: protowire.KaspadMessage.getBalanceByAddressResponse:type_name -> protowire.GetBalanceByAddressResponseMessage
|
||||||
121, // 121: protowire.KaspadMessage.getBalancesByAddressesRequest:type_name -> protowire.GetBalancesByAddressesRequestMessage
|
121, // 121: protowire.KaspadMessage.getBalancesByAddressesRequest:type_name -> protowire.GetBalancesByAddressesRequestMessage
|
||||||
122, // 122: protowire.KaspadMessage.getBalancesByAddressesResponse:type_name -> protowire.GetBalancesByAddressesResponseMessage
|
122, // 122: protowire.KaspadMessage.getBalancesByAddressesResponse:type_name -> protowire.GetBalancesByAddressesResponseMessage
|
||||||
0, // 123: protowire.P2P.MessageStream:input_type -> protowire.KaspadMessage
|
123, // 123: protowire.KaspadMessage.notifyNewBlockTemplateRequest:type_name -> protowire.NotifyNewBlockTemplateRequestMessage
|
||||||
0, // 124: protowire.RPC.MessageStream:input_type -> protowire.KaspadMessage
|
124, // 124: protowire.KaspadMessage.notifyNewBlockTemplateResponse:type_name -> protowire.NotifyNewBlockTemplateResponseMessage
|
||||||
0, // 125: protowire.P2P.MessageStream:output_type -> protowire.KaspadMessage
|
125, // 125: protowire.KaspadMessage.newBlockTemplateNotification:type_name -> protowire.NewBlockTemplateNotificationMessage
|
||||||
0, // 126: protowire.RPC.MessageStream:output_type -> protowire.KaspadMessage
|
0, // 126: protowire.P2P.MessageStream:input_type -> protowire.KaspadMessage
|
||||||
125, // [125:127] is the sub-list for method output_type
|
0, // 127: protowire.RPC.MessageStream:input_type -> protowire.KaspadMessage
|
||||||
123, // [123:125] is the sub-list for method input_type
|
0, // 128: protowire.P2P.MessageStream:output_type -> protowire.KaspadMessage
|
||||||
123, // [123:123] is the sub-list for extension type_name
|
0, // 129: protowire.RPC.MessageStream:output_type -> protowire.KaspadMessage
|
||||||
123, // [123:123] is the sub-list for extension extendee
|
128, // [128:130] is the sub-list for method output_type
|
||||||
0, // [0:123] is the sub-list for field type_name
|
126, // [126:128] is the sub-list for method input_type
|
||||||
|
126, // [126:126] is the sub-list for extension type_name
|
||||||
|
126, // [126:126] is the sub-list for extension extendee
|
||||||
|
0, // [0:126] is the sub-list for field type_name
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_messages_proto_init() }
|
func init() { file_messages_proto_init() }
|
||||||
@ -3057,6 +3128,9 @@ func file_messages_proto_init() {
|
|||||||
(*KaspadMessage_GetBalanceByAddressResponse)(nil),
|
(*KaspadMessage_GetBalanceByAddressResponse)(nil),
|
||||||
(*KaspadMessage_GetBalancesByAddressesRequest)(nil),
|
(*KaspadMessage_GetBalancesByAddressesRequest)(nil),
|
||||||
(*KaspadMessage_GetBalancesByAddressesResponse)(nil),
|
(*KaspadMessage_GetBalancesByAddressesResponse)(nil),
|
||||||
|
(*KaspadMessage_NotifyNewBlockTemplateRequest)(nil),
|
||||||
|
(*KaspadMessage_NotifyNewBlockTemplateResponse)(nil),
|
||||||
|
(*KaspadMessage_NewBlockTemplateNotification)(nil),
|
||||||
}
|
}
|
||||||
type x struct{}
|
type x struct{}
|
||||||
out := protoimpl.TypeBuilder{
|
out := protoimpl.TypeBuilder{
|
||||||
|
@ -132,6 +132,9 @@ message KaspadMessage {
|
|||||||
GetBalanceByAddressResponseMessage getBalanceByAddressResponse = 1078;
|
GetBalanceByAddressResponseMessage getBalanceByAddressResponse = 1078;
|
||||||
GetBalancesByAddressesRequestMessage getBalancesByAddressesRequest = 1079;
|
GetBalancesByAddressesRequestMessage getBalancesByAddressesRequest = 1079;
|
||||||
GetBalancesByAddressesResponseMessage getBalancesByAddressesResponse = 1080;
|
GetBalancesByAddressesResponseMessage getBalancesByAddressesResponse = 1080;
|
||||||
|
NotifyNewBlockTemplateRequestMessage notifyNewBlockTemplateRequest = 1081;
|
||||||
|
NotifyNewBlockTemplateResponseMessage notifyNewBlockTemplateResponse = 1082;
|
||||||
|
NewBlockTemplateNotificationMessage newBlockTemplateNotification = 1083;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,6 +103,9 @@
|
|||||||
- [GetInfoResponseMessage](#protowire.GetInfoResponseMessage)
|
- [GetInfoResponseMessage](#protowire.GetInfoResponseMessage)
|
||||||
- [EstimateNetworkHashesPerSecondRequestMessage](#protowire.EstimateNetworkHashesPerSecondRequestMessage)
|
- [EstimateNetworkHashesPerSecondRequestMessage](#protowire.EstimateNetworkHashesPerSecondRequestMessage)
|
||||||
- [EstimateNetworkHashesPerSecondResponseMessage](#protowire.EstimateNetworkHashesPerSecondResponseMessage)
|
- [EstimateNetworkHashesPerSecondResponseMessage](#protowire.EstimateNetworkHashesPerSecondResponseMessage)
|
||||||
|
- [NotifyNewBlockTemplateRequestMessage](#protowire.NotifyNewBlockTemplateRequestMessage)
|
||||||
|
- [NotifyNewBlockTemplateResponseMessage](#protowire.NotifyNewBlockTemplateResponseMessage)
|
||||||
|
- [NewBlockTemplateNotificationMessage](#protowire.NewBlockTemplateNotificationMessage)
|
||||||
|
|
||||||
- [SubmitBlockResponseMessage.RejectReason](#protowire.SubmitBlockResponseMessage.RejectReason)
|
- [SubmitBlockResponseMessage.RejectReason](#protowire.SubmitBlockResponseMessage.RejectReason)
|
||||||
|
|
||||||
@ -1694,6 +1697,47 @@ GetInfoRequestMessage returns info about the node.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="protowire.NotifyNewBlockTemplateRequestMessage"></a>
|
||||||
|
|
||||||
|
### NotifyNewBlockTemplateRequestMessage
|
||||||
|
NotifyNewBlockTemplateRequestMessage registers this connection for
|
||||||
|
NewBlockTemplate notifications.
|
||||||
|
|
||||||
|
See: NewBlockTemplateNotificationMessage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="protowire.NotifyNewBlockTemplateResponseMessage"></a>
|
||||||
|
|
||||||
|
### NotifyNewBlockTemplateResponseMessage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| Field | Type | Label | Description |
|
||||||
|
| ----- | ---- | ----- | ----------- |
|
||||||
|
| error | [RPCError](#protowire.RPCError) | | |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="protowire.NewBlockTemplateNotificationMessage"></a>
|
||||||
|
|
||||||
|
### NewBlockTemplateNotificationMessage
|
||||||
|
NewBlockTemplateNotificationMessage is sent whenever a new updated block template is
|
||||||
|
available for miners.
|
||||||
|
|
||||||
|
See NotifyNewBlockTemplateRequestMessage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -5542,6 +5542,137 @@ func (x *EstimateNetworkHashesPerSecondResponseMessage) GetError() *RPCError {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotifyNewBlockTemplateRequestMessage registers this connection for
|
||||||
|
// NewBlockTemplate notifications.
|
||||||
|
//
|
||||||
|
// See: NewBlockTemplateNotificationMessage
|
||||||
|
type NotifyNewBlockTemplateRequestMessage struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NotifyNewBlockTemplateRequestMessage) Reset() {
|
||||||
|
*x = NotifyNewBlockTemplateRequestMessage{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_rpc_proto_msgTypes[99]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NotifyNewBlockTemplateRequestMessage) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*NotifyNewBlockTemplateRequestMessage) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *NotifyNewBlockTemplateRequestMessage) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_rpc_proto_msgTypes[99]
|
||||||
|
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 NotifyNewBlockTemplateRequestMessage.ProtoReflect.Descriptor instead.
|
||||||
|
func (*NotifyNewBlockTemplateRequestMessage) Descriptor() ([]byte, []int) {
|
||||||
|
return file_rpc_proto_rawDescGZIP(), []int{99}
|
||||||
|
}
|
||||||
|
|
||||||
|
type NotifyNewBlockTemplateResponseMessage struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
Error *RPCError `protobuf:"bytes,1000,opt,name=error,proto3" json:"error,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NotifyNewBlockTemplateResponseMessage) Reset() {
|
||||||
|
*x = NotifyNewBlockTemplateResponseMessage{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_rpc_proto_msgTypes[100]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NotifyNewBlockTemplateResponseMessage) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*NotifyNewBlockTemplateResponseMessage) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *NotifyNewBlockTemplateResponseMessage) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_rpc_proto_msgTypes[100]
|
||||||
|
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 NotifyNewBlockTemplateResponseMessage.ProtoReflect.Descriptor instead.
|
||||||
|
func (*NotifyNewBlockTemplateResponseMessage) Descriptor() ([]byte, []int) {
|
||||||
|
return file_rpc_proto_rawDescGZIP(), []int{100}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NotifyNewBlockTemplateResponseMessage) GetError() *RPCError {
|
||||||
|
if x != nil {
|
||||||
|
return x.Error
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBlockTemplateNotificationMessage is sent whenever a new updated block template is
|
||||||
|
// available for miners.
|
||||||
|
//
|
||||||
|
// See NotifyNewBlockTemplateRequestMessage
|
||||||
|
type NewBlockTemplateNotificationMessage struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NewBlockTemplateNotificationMessage) Reset() {
|
||||||
|
*x = NewBlockTemplateNotificationMessage{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_rpc_proto_msgTypes[101]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NewBlockTemplateNotificationMessage) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*NewBlockTemplateNotificationMessage) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *NewBlockTemplateNotificationMessage) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_rpc_proto_msgTypes[101]
|
||||||
|
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 NewBlockTemplateNotificationMessage.ProtoReflect.Descriptor instead.
|
||||||
|
func (*NewBlockTemplateNotificationMessage) Descriptor() ([]byte, []int) {
|
||||||
|
return file_rpc_proto_rawDescGZIP(), []int{101}
|
||||||
|
}
|
||||||
|
|
||||||
var File_rpc_proto protoreflect.FileDescriptor
|
var File_rpc_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
var file_rpc_proto_rawDesc = []byte{
|
var file_rpc_proto_rawDesc = []byte{
|
||||||
@ -6244,10 +6375,21 @@ var file_rpc_proto_rawDesc = []byte{
|
|||||||
0x6f, 0x72, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f,
|
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,
|
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,
|
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,
|
0x50, 0x43, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x26,
|
||||||
0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73,
|
0x0a, 0x24, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
|
||||||
0x70, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f,
|
0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d,
|
||||||
0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x25, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79,
|
||||||
|
0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
|
||||||
|
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 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, 0x22, 0x25, 0x0a, 0x23, 0x4e,
|
||||||
|
0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e,
|
||||||
|
0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61,
|
||||||
|
0x67, 0x65, 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 (
|
var (
|
||||||
@ -6263,7 +6405,7 @@ func file_rpc_proto_rawDescGZIP() []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var file_rpc_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
|
var file_rpc_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
|
||||||
var file_rpc_proto_msgTypes = make([]protoimpl.MessageInfo, 99)
|
var file_rpc_proto_msgTypes = make([]protoimpl.MessageInfo, 102)
|
||||||
var file_rpc_proto_goTypes = []interface{}{
|
var file_rpc_proto_goTypes = []interface{}{
|
||||||
(SubmitBlockResponseMessage_RejectReason)(0), // 0: protowire.SubmitBlockResponseMessage.RejectReason
|
(SubmitBlockResponseMessage_RejectReason)(0), // 0: protowire.SubmitBlockResponseMessage.RejectReason
|
||||||
(*RPCError)(nil), // 1: protowire.RPCError
|
(*RPCError)(nil), // 1: protowire.RPCError
|
||||||
@ -6365,6 +6507,9 @@ var file_rpc_proto_goTypes = []interface{}{
|
|||||||
(*GetInfoResponseMessage)(nil), // 97: protowire.GetInfoResponseMessage
|
(*GetInfoResponseMessage)(nil), // 97: protowire.GetInfoResponseMessage
|
||||||
(*EstimateNetworkHashesPerSecondRequestMessage)(nil), // 98: protowire.EstimateNetworkHashesPerSecondRequestMessage
|
(*EstimateNetworkHashesPerSecondRequestMessage)(nil), // 98: protowire.EstimateNetworkHashesPerSecondRequestMessage
|
||||||
(*EstimateNetworkHashesPerSecondResponseMessage)(nil), // 99: protowire.EstimateNetworkHashesPerSecondResponseMessage
|
(*EstimateNetworkHashesPerSecondResponseMessage)(nil), // 99: protowire.EstimateNetworkHashesPerSecondResponseMessage
|
||||||
|
(*NotifyNewBlockTemplateRequestMessage)(nil), // 100: protowire.NotifyNewBlockTemplateRequestMessage
|
||||||
|
(*NotifyNewBlockTemplateResponseMessage)(nil), // 101: protowire.NotifyNewBlockTemplateResponseMessage
|
||||||
|
(*NewBlockTemplateNotificationMessage)(nil), // 102: protowire.NewBlockTemplateNotificationMessage
|
||||||
}
|
}
|
||||||
var file_rpc_proto_depIdxs = []int32{
|
var file_rpc_proto_depIdxs = []int32{
|
||||||
3, // 0: protowire.RpcBlock.header:type_name -> protowire.RpcBlockHeader
|
3, // 0: protowire.RpcBlock.header:type_name -> protowire.RpcBlockHeader
|
||||||
@ -6435,11 +6580,12 @@ var file_rpc_proto_depIdxs = []int32{
|
|||||||
1, // 65: protowire.UnbanResponseMessage.error:type_name -> protowire.RPCError
|
1, // 65: protowire.UnbanResponseMessage.error:type_name -> protowire.RPCError
|
||||||
1, // 66: protowire.GetInfoResponseMessage.error:type_name -> protowire.RPCError
|
1, // 66: protowire.GetInfoResponseMessage.error:type_name -> protowire.RPCError
|
||||||
1, // 67: protowire.EstimateNetworkHashesPerSecondResponseMessage.error:type_name -> protowire.RPCError
|
1, // 67: protowire.EstimateNetworkHashesPerSecondResponseMessage.error:type_name -> protowire.RPCError
|
||||||
68, // [68:68] is the sub-list for method output_type
|
1, // 68: protowire.NotifyNewBlockTemplateResponseMessage.error:type_name -> protowire.RPCError
|
||||||
68, // [68:68] is the sub-list for method input_type
|
69, // [69:69] is the sub-list for method output_type
|
||||||
68, // [68:68] is the sub-list for extension type_name
|
69, // [69:69] is the sub-list for method input_type
|
||||||
68, // [68:68] is the sub-list for extension extendee
|
69, // [69:69] is the sub-list for extension type_name
|
||||||
0, // [0:68] is the sub-list for field type_name
|
69, // [69:69] is the sub-list for extension extendee
|
||||||
|
0, // [0:69] is the sub-list for field type_name
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_rpc_proto_init() }
|
func init() { file_rpc_proto_init() }
|
||||||
@ -7636,6 +7782,42 @@ func file_rpc_proto_init() {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
file_rpc_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*NotifyNewBlockTemplateRequestMessage); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_rpc_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*NotifyNewBlockTemplateResponseMessage); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_rpc_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*NewBlockTemplateNotificationMessage); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
type x struct{}
|
type x struct{}
|
||||||
out := protoimpl.TypeBuilder{
|
out := protoimpl.TypeBuilder{
|
||||||
@ -7643,7 +7825,7 @@ func file_rpc_proto_init() {
|
|||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
RawDescriptor: file_rpc_proto_rawDesc,
|
RawDescriptor: file_rpc_proto_rawDesc,
|
||||||
NumEnums: 1,
|
NumEnums: 1,
|
||||||
NumMessages: 99,
|
NumMessages: 102,
|
||||||
NumExtensions: 0,
|
NumExtensions: 0,
|
||||||
NumServices: 0,
|
NumServices: 0,
|
||||||
},
|
},
|
||||||
|
@ -654,4 +654,22 @@ message EstimateNetworkHashesPerSecondResponseMessage{
|
|||||||
RPCError error = 1000;
|
RPCError error = 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotifyNewBlockTemplateRequestMessage registers this connection for
|
||||||
|
// NewBlockTemplate notifications.
|
||||||
|
//
|
||||||
|
// See: NewBlockTemplateNotificationMessage
|
||||||
|
message NotifyNewBlockTemplateRequestMessage {
|
||||||
|
}
|
||||||
|
|
||||||
|
message NotifyNewBlockTemplateResponseMessage {
|
||||||
|
RPCError error = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBlockTemplateNotificationMessage is sent whenever a new updated block template is
|
||||||
|
// available for miners.
|
||||||
|
//
|
||||||
|
// See NotifyNewBlockTemplateRequestMessage
|
||||||
|
message NewBlockTemplateNotificationMessage {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,66 @@
|
|||||||
|
package protowire
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/kaspanet/kaspad/app/appmessage"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (x *KaspadMessage_NotifyNewBlockTemplateRequest) toAppMessage() (appmessage.Message, error) {
|
||||||
|
return &appmessage.NotifyNewBlockTemplateRequestMessage{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KaspadMessage_NotifyNewBlockTemplateRequest) fromAppMessage(_ *appmessage.NotifyNewBlockTemplateRequestMessage) error {
|
||||||
|
x.NotifyNewBlockTemplateRequest = &NotifyNewBlockTemplateRequestMessage{}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KaspadMessage_NotifyNewBlockTemplateResponse) toAppMessage() (appmessage.Message, error) {
|
||||||
|
if x == nil {
|
||||||
|
return nil, errors.Wrapf(errorNil, "KaspadMessage_NotifyNewBlockTemplateResponse is nil")
|
||||||
|
}
|
||||||
|
return x.NotifyNewBlockTemplateResponse.toAppMessage()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KaspadMessage_NotifyNewBlockTemplateResponse) fromAppMessage(message *appmessage.NotifyNewBlockTemplateResponseMessage) error {
|
||||||
|
var err *RPCError
|
||||||
|
if message.Error != nil {
|
||||||
|
err = &RPCError{Message: message.Error.Message}
|
||||||
|
}
|
||||||
|
x.NotifyNewBlockTemplateResponse = &NotifyNewBlockTemplateResponseMessage{
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NotifyNewBlockTemplateResponseMessage) toAppMessage() (appmessage.Message, error) {
|
||||||
|
if x == nil {
|
||||||
|
return nil, errors.Wrapf(errorNil, "NotifyNewBlockTemplateResponseMessage is nil")
|
||||||
|
}
|
||||||
|
rpcErr, err := x.Error.toAppMessage()
|
||||||
|
// Error is an optional field
|
||||||
|
if err != nil && !errors.Is(err, errorNil) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &appmessage.NotifyNewBlockTemplateResponseMessage{
|
||||||
|
Error: rpcErr,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KaspadMessage_NewBlockTemplateNotification) toAppMessage() (appmessage.Message, error) {
|
||||||
|
if x == nil {
|
||||||
|
return nil, errors.Wrapf(errorNil, "KaspadMessage_NewBlockTemplateNotification is nil")
|
||||||
|
}
|
||||||
|
return x.NewBlockTemplateNotification.toAppMessage()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *KaspadMessage_NewBlockTemplateNotification) fromAppMessage(message *appmessage.NewBlockTemplateNotificationMessage) error {
|
||||||
|
x.NewBlockTemplateNotification = &NewBlockTemplateNotificationMessage{}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NewBlockTemplateNotificationMessage) toAppMessage() (appmessage.Message, error) {
|
||||||
|
if x == nil {
|
||||||
|
return nil, errors.Wrapf(errorNil, "NewBlockTemplateNotificationMessage is nil")
|
||||||
|
}
|
||||||
|
return &appmessage.NewBlockTemplateNotificationMessage{}, nil
|
||||||
|
}
|
@ -919,6 +919,27 @@ func toRPCPayload(message appmessage.Message) (isKaspadMessage_Payload, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return payload, nil
|
return payload, nil
|
||||||
|
case *appmessage.NotifyNewBlockTemplateRequestMessage:
|
||||||
|
payload := new(KaspadMessage_NotifyNewBlockTemplateRequest)
|
||||||
|
err := payload.fromAppMessage(message)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return payload, nil
|
||||||
|
case *appmessage.NotifyNewBlockTemplateResponseMessage:
|
||||||
|
payload := new(KaspadMessage_NotifyNewBlockTemplateResponse)
|
||||||
|
err := payload.fromAppMessage(message)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return payload, nil
|
||||||
|
case *appmessage.NewBlockTemplateNotificationMessage:
|
||||||
|
payload := new(KaspadMessage_NewBlockTemplateNotification)
|
||||||
|
err := payload.fromAppMessage(message)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return payload, nil
|
||||||
default:
|
default:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
package rpcclient
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/kaspanet/kaspad/app/appmessage"
|
||||||
|
routerpkg "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RegisterForNewBlockTemplateNotifications sends an RPC request respective to the function's name and returns the RPC server's response.
|
||||||
|
// Additionally, it starts listening for the appropriate notification using the given handler function
|
||||||
|
func (c *RPCClient) RegisterForNewBlockTemplateNotifications(onNewBlockTemplate func(notification *appmessage.NewBlockTemplateNotificationMessage)) error {
|
||||||
|
err := c.rpcRouter.outgoingRoute().Enqueue(appmessage.NewNotifyNewBlockTemplateRequestMessage())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
response, err := c.route(appmessage.CmdNotifyNewBlockTemplateResponseMessage).DequeueWithTimeout(c.timeout)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
notifyNewBlockTemplateResponse := response.(*appmessage.NotifyNewBlockTemplateResponseMessage)
|
||||||
|
if notifyNewBlockTemplateResponse.Error != nil {
|
||||||
|
return c.convertRPCError(notifyNewBlockTemplateResponse.Error)
|
||||||
|
}
|
||||||
|
spawn("RegisterForNewBlockTemplateNotifications", func() {
|
||||||
|
for {
|
||||||
|
notification, err := c.route(appmessage.CmdNewBlockTemplateNotificationMessage).Dequeue()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, routerpkg.ErrRouteClosed) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
NewBlockTemplateNotification := notification.(*appmessage.NewBlockTemplateNotificationMessage)
|
||||||
|
onNewBlockTemplate(NewBlockTemplateNotification)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user