mirror of
				https://source.quilibrium.com/quilibrium/ceremonyclient.git
				synced 2025-04-04 19:36:54 +00:00 
			
		
		
		
	
							parent
							
								
									0baa4ea341
								
							
						
					
					
						commit
						5a3af70dc8
					
				| @ -26,7 +26,7 @@ const ( | |||||||
| var ( | var ( | ||||||
| 	BlossomSubD                                = 6 | 	BlossomSubD                                = 6 | ||||||
| 	BlossomSubDlo                              = 5 | 	BlossomSubDlo                              = 5 | ||||||
| 	BlossomSubDhi                              = 24 | 	BlossomSubDhi                              = 10 | ||||||
| 	BlossomSubDscore                           = 4 | 	BlossomSubDscore                           = 4 | ||||||
| 	BlossomSubDout                             = 2 | 	BlossomSubDout                             = 2 | ||||||
| 	BlossomSubHistoryLength                    = 5 | 	BlossomSubHistoryLength                    = 5 | ||||||
|  | |||||||
| @ -27,10 +27,23 @@ func logger() *zap.Logger { | |||||||
| 	return log | 	return log | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func debugLogger() *zap.Logger { | ||||||
|  | 	log, err := zap.NewDevelopment() | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return log | ||||||
|  | } | ||||||
|  | 
 | ||||||
| var loggerSet = wire.NewSet( | var loggerSet = wire.NewSet( | ||||||
| 	logger, | 	logger, | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var debugLoggerSet = wire.NewSet( | ||||||
|  | 	debugLogger, | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| var keyManagerSet = wire.NewSet( | var keyManagerSet = wire.NewSet( | ||||||
| 	wire.FieldsOf(new(*config.Config), "Key"), | 	wire.FieldsOf(new(*config.Config), "Key"), | ||||||
| 	keys.NewFileKeyManager, | 	keys.NewFileKeyManager, | ||||||
| @ -75,6 +88,18 @@ var consensusSet = wire.NewSet( | |||||||
| 	), | 	), | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | func NewDebugNode(*config.Config, *protobufs.SelfTestReport) (*Node, error) { | ||||||
|  | 	panic(wire.Build( | ||||||
|  | 		debugLoggerSet, | ||||||
|  | 		keyManagerSet, | ||||||
|  | 		storeSet, | ||||||
|  | 		pubSubSet, | ||||||
|  | 		engineSet, | ||||||
|  | 		consensusSet, | ||||||
|  | 		newNode, | ||||||
|  | 	)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func NewNode(*config.Config, *protobufs.SelfTestReport) (*Node, error) { | func NewNode(*config.Config, *protobufs.SelfTestReport) (*Node, error) { | ||||||
| 	panic(wire.Build( | 	panic(wire.Build( | ||||||
| 		loggerSet, | 		loggerSet, | ||||||
|  | |||||||
| @ -23,6 +23,30 @@ import ( | |||||||
| 
 | 
 | ||||||
| // Injectors from wire.go:
 | // Injectors from wire.go:
 | ||||||
| 
 | 
 | ||||||
|  | func NewDebugNode(configConfig *config.Config, selfTestReport *protobufs.SelfTestReport) (*Node, error) { | ||||||
|  | 	zapLogger := debugLogger() | ||||||
|  | 	dbConfig := configConfig.DB | ||||||
|  | 	pebbleDB := store.NewPebbleDB(dbConfig) | ||||||
|  | 	pebbleClockStore := store.NewPebbleClockStore(pebbleDB, zapLogger) | ||||||
|  | 	keyConfig := configConfig.Key | ||||||
|  | 	fileKeyManager := keys.NewFileKeyManager(keyConfig, zapLogger) | ||||||
|  | 	p2PConfig := configConfig.P2P | ||||||
|  | 	blossomSub := p2p.NewBlossomSub(p2PConfig, zapLogger) | ||||||
|  | 	engineConfig := configConfig.Engine | ||||||
|  | 	wesolowskiFrameProver := crypto.NewWesolowskiFrameProver(zapLogger) | ||||||
|  | 	kzgInclusionProver := crypto.NewKZGInclusionProver(zapLogger) | ||||||
|  | 	masterTimeReel := time.NewMasterTimeReel(zapLogger, pebbleClockStore, engineConfig, wesolowskiFrameProver) | ||||||
|  | 	inMemoryPeerInfoManager := p2p.NewInMemoryPeerInfoManager(zapLogger) | ||||||
|  | 	pebbleKeyStore := store.NewPebbleKeyStore(pebbleDB, zapLogger) | ||||||
|  | 	ceremonyExecutionEngine := ceremony.NewCeremonyExecutionEngine(zapLogger, engineConfig, fileKeyManager, blossomSub, wesolowskiFrameProver, kzgInclusionProver, pebbleClockStore, masterTimeReel, inMemoryPeerInfoManager, pebbleKeyStore) | ||||||
|  | 	masterClockConsensusEngine := master.NewMasterClockConsensusEngine(engineConfig, zapLogger, pebbleClockStore, fileKeyManager, blossomSub, wesolowskiFrameProver, masterTimeReel, inMemoryPeerInfoManager, selfTestReport) | ||||||
|  | 	node, err := newNode(zapLogger, pebbleClockStore, fileKeyManager, blossomSub, ceremonyExecutionEngine, masterClockConsensusEngine) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return node, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func NewNode(configConfig *config.Config, selfTestReport *protobufs.SelfTestReport) (*Node, error) { | func NewNode(configConfig *config.Config, selfTestReport *protobufs.SelfTestReport) (*Node, error) { | ||||||
| 	zapLogger := logger() | 	zapLogger := logger() | ||||||
| 	dbConfig := configConfig.DB | 	dbConfig := configConfig.DB | ||||||
| @ -74,10 +98,23 @@ func logger() *zap.Logger { | |||||||
| 	return log | 	return log | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func debugLogger() *zap.Logger { | ||||||
|  | 	log, err := zap.NewDevelopment() | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return log | ||||||
|  | } | ||||||
|  | 
 | ||||||
| var loggerSet = wire.NewSet( | var loggerSet = wire.NewSet( | ||||||
| 	logger, | 	logger, | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var debugLoggerSet = wire.NewSet( | ||||||
|  | 	debugLogger, | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| var keyManagerSet = wire.NewSet(wire.FieldsOf(new(*config.Config), "Key"), keys.NewFileKeyManager, wire.Bind(new(keys.KeyManager), new(*keys.FileKeyManager))) | var keyManagerSet = wire.NewSet(wire.FieldsOf(new(*config.Config), "Key"), keys.NewFileKeyManager, wire.Bind(new(keys.KeyManager), new(*keys.FileKeyManager))) | ||||||
| 
 | 
 | ||||||
| var storeSet = wire.NewSet(wire.FieldsOf(new(*config.Config), "DB"), store.NewPebbleDB, wire.Bind(new(store.KVDB), new(*store.PebbleDB)), store.NewPebbleClockStore, store.NewPebbleKeyStore, store.NewPebbleDataProofStore, wire.Bind(new(store.ClockStore), new(*store.PebbleClockStore)), wire.Bind(new(store.KeyStore), new(*store.PebbleKeyStore)), wire.Bind(new(store.DataProofStore), new(*store.PebbleDataProofStore))) | var storeSet = wire.NewSet(wire.FieldsOf(new(*config.Config), "DB"), store.NewPebbleDB, wire.Bind(new(store.KVDB), new(*store.PebbleDB)), store.NewPebbleClockStore, store.NewPebbleKeyStore, store.NewPebbleDataProofStore, wire.Bind(new(store.ClockStore), new(*store.PebbleClockStore)), wire.Bind(new(store.KeyStore), new(*store.PebbleKeyStore)), wire.Bind(new(store.DataProofStore), new(*store.PebbleDataProofStore))) | ||||||
|  | |||||||
| @ -6,15 +6,15 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func GetMinimumVersionCutoff() time.Time { | func GetMinimumVersionCutoff() time.Time { | ||||||
| 	return time.Date(2024, time.March, 21, 5, 00, 0, 0, time.UTC) | 	return time.Date(2024, time.March, 27, 8, 30, 0, 0, time.UTC) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func GetMinimumVersion() []byte { | func GetMinimumVersion() []byte { | ||||||
| 	return []byte{0x01, 0x04, 0x0B} | 	return []byte{0x01, 0x04, 0x0D} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func GetVersion() []byte { | func GetVersion() []byte { | ||||||
| 	return []byte{0x01, 0x04, 0x0C} | 	return []byte{0x01, 0x04, 0x0D} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func GetVersionString() string { | func GetVersionString() string { | ||||||
|  | |||||||
| @ -242,7 +242,7 @@ func NewCeremonyDataClockConsensusEngine( | |||||||
| 		dataTimeReel:              dataTimeReel, | 		dataTimeReel:              dataTimeReel, | ||||||
| 		peerInfoManager:           peerInfoManager, | 		peerInfoManager:           peerInfoManager, | ||||||
| 		statsClient:               statsClient, | 		statsClient:               statsClient, | ||||||
| 		messageProcessorCh:        make(chan *pb.Message, 128), | 		messageProcessorCh:        make(chan *pb.Message), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	logger.Info("constructing consensus engine") | 	logger.Info("constructing consensus engine") | ||||||
| @ -280,9 +280,7 @@ func (e *CeremonyDataClockConsensusEngine) Start() <-chan error { | |||||||
| 		panic(err) | 		panic(err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	go func() { | 	go e.runMessageHandler() | ||||||
| 		e.runMessageHandler() |  | ||||||
| 	}() |  | ||||||
| 
 | 
 | ||||||
| 	e.logger.Info("subscribing to pubsub messages") | 	e.logger.Info("subscribing to pubsub messages") | ||||||
| 	e.pubSub.Subscribe(e.filter, e.handleMessage, true) | 	e.pubSub.Subscribe(e.filter, e.handleMessage, true) | ||||||
| @ -309,8 +307,6 @@ func (e *CeremonyDataClockConsensusEngine) Start() <-chan error { | |||||||
| 		thresholdBeforeConfirming := 4 | 		thresholdBeforeConfirming := 4 | ||||||
| 
 | 
 | ||||||
| 		for { | 		for { | ||||||
| 			time.Sleep(120 * time.Second) |  | ||||||
| 
 |  | ||||||
| 			list := &protobufs.CeremonyPeerListAnnounce{ | 			list := &protobufs.CeremonyPeerListAnnounce{ | ||||||
| 				PeerList: []*protobufs.CeremonyPeer{}, | 				PeerList: []*protobufs.CeremonyPeer{}, | ||||||
| 			} | 			} | ||||||
| @ -413,12 +409,12 @@ func (e *CeremonyDataClockConsensusEngine) Start() <-chan error { | |||||||
| 			if thresholdBeforeConfirming > 0 { | 			if thresholdBeforeConfirming > 0 { | ||||||
| 				thresholdBeforeConfirming-- | 				thresholdBeforeConfirming-- | ||||||
| 			} | 			} | ||||||
|  | 
 | ||||||
|  | 			time.Sleep(120 * time.Second) | ||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
| 
 | 
 | ||||||
| 	go func() { | 	go e.runLoop() | ||||||
| 		e.runLoop() |  | ||||||
| 	}() |  | ||||||
| 
 | 
 | ||||||
| 	go func() { | 	go func() { | ||||||
| 		errChan <- nil | 		errChan <- nil | ||||||
| @ -467,7 +463,10 @@ func (e *CeremonyDataClockConsensusEngine) runLoop() { | |||||||
| 				if e.latestFrameReceived < latestFrame.FrameNumber { | 				if e.latestFrameReceived < latestFrame.FrameNumber { | ||||||
| 					e.latestFrameReceived = latestFrame.FrameNumber | 					e.latestFrameReceived = latestFrame.FrameNumber | ||||||
| 					go func() { | 					go func() { | ||||||
| 						e.frameChan <- latestFrame | 						select { | ||||||
|  | 						case e.frameChan <- latestFrame: | ||||||
|  | 						default: | ||||||
|  | 						} | ||||||
| 					}() | 					}() | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| @ -512,7 +511,10 @@ func (e *CeremonyDataClockConsensusEngine) runLoop() { | |||||||
| 				if e.latestFrameReceived < latestFrame.FrameNumber { | 				if e.latestFrameReceived < latestFrame.FrameNumber { | ||||||
| 					e.latestFrameReceived = latestFrame.FrameNumber | 					e.latestFrameReceived = latestFrame.FrameNumber | ||||||
| 					go func() { | 					go func() { | ||||||
| 						e.frameChan <- latestFrame | 						select { | ||||||
|  | 						case e.frameChan <- latestFrame: | ||||||
|  | 						default: | ||||||
|  | 						} | ||||||
| 					}() | 					}() | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,8 +3,6 @@ package ceremony | |||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"context" | 	"context" | ||||||
| 	"encoding/binary" |  | ||||||
| 	"io" |  | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/config" | 	"source.quilibrium.com/quilibrium/monorepo/node/config" | ||||||
| @ -161,6 +159,13 @@ func (e *CeremonyDataClockConsensusEngine) GetMostAheadPeer( | |||||||
| 	var peer []byte = nil | 	var peer []byte = nil | ||||||
| 	e.peerMapMx.RLock() | 	e.peerMapMx.RLock() | ||||||
| 	for _, v := range e.peerMap { | 	for _, v := range e.peerMap { | ||||||
|  | 		e.logger.Debug( | ||||||
|  | 			"checking peer info", | ||||||
|  | 			zap.Binary("peer_id", v.peerId), | ||||||
|  | 			zap.Uint64("max_frame_number", v.maxFrame), | ||||||
|  | 			zap.Int64("timestamp", v.timestamp), | ||||||
|  | 			zap.Binary("version", v.version), | ||||||
|  | 		) | ||||||
| 		_, ok := e.uncooperativePeersMap[string(v.peerId)] | 		_, ok := e.uncooperativePeersMap[string(v.peerId)] | ||||||
| 		if v.maxFrame > max && | 		if v.maxFrame > max && | ||||||
| 			v.timestamp > config.GetMinimumVersionCutoff().UnixMilli() && | 			v.timestamp > config.GetMinimumVersionCutoff().UnixMilli() && | ||||||
| @ -203,52 +208,16 @@ func (e *CeremonyDataClockConsensusEngine) sync( | |||||||
| 
 | 
 | ||||||
| 	client := protobufs.NewCeremonyServiceClient(cc) | 	client := protobufs.NewCeremonyServiceClient(cc) | ||||||
| 
 | 
 | ||||||
| 	from := latest.FrameNumber | 	response, err := client.GetDataFrame( | ||||||
| 	if from == 0 { | 		context.TODO(), | ||||||
| 		from = 1 | 		&protobufs.GetDataFrameRequest{ | ||||||
| 	} | 			FrameNumber: 0, | ||||||
| 
 | 		}, | ||||||
| 	rangeParentSelectors := []*protobufs.ClockFrameParentSelectors{} |  | ||||||
| 	if from > 128 { |  | ||||||
| 		rangeSubtract := uint64(16) |  | ||||||
| 		for { |  | ||||||
| 			if from <= rangeSubtract { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			parentNumber := from - uint64(rangeSubtract) |  | ||||||
| 			rangeSubtract *= 2 |  | ||||||
| 			parent, _, err := e.clockStore.GetDataClockFrame( |  | ||||||
| 				e.filter, |  | ||||||
| 				parentNumber, |  | ||||||
| 				true, |  | ||||||
| 			) |  | ||||||
| 			if err != nil { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			parentSelector, err := parent.GetSelector() |  | ||||||
| 			if err != nil { |  | ||||||
| 				panic(err) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			rangeParentSelectors = append( |  | ||||||
| 				rangeParentSelectors, |  | ||||||
| 				&protobufs.ClockFrameParentSelectors{ |  | ||||||
| 					FrameNumber:    parentNumber, |  | ||||||
| 					ParentSelector: parentSelector.FillBytes(make([]byte, 32)), |  | ||||||
| 				}, |  | ||||||
| 			) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	s, err := client.NegotiateCompressedSyncFrames( |  | ||||||
| 		context.Background(), |  | ||||||
| 		grpc.MaxCallRecvMsgSize(600*1024*1024), | 		grpc.MaxCallRecvMsgSize(600*1024*1024), | ||||||
| 	) | 	) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.logger.Debug( | 		e.logger.Error( | ||||||
| 			"received error from peer", | 			"could not get frame", | ||||||
| 			zap.Error(err), | 			zap.Error(err), | ||||||
| 		) | 		) | ||||||
| 		e.peerMapMx.Lock() | 		e.peerMapMx.Lock() | ||||||
| @ -258,249 +227,31 @@ func (e *CeremonyDataClockConsensusEngine) sync( | |||||||
| 			delete(e.peerMap, string(peerId)) | 			delete(e.peerMap, string(peerId)) | ||||||
| 		} | 		} | ||||||
| 		e.peerMapMx.Unlock() | 		e.peerMapMx.Unlock() | ||||||
| 		return latest, errors.Wrap(err, "sync") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	challenge := binary.BigEndian.AppendUint64( |  | ||||||
| 		append([]byte{}, peerId...), |  | ||||||
| 		uint64(time.Now().UnixMilli()), |  | ||||||
| 	) |  | ||||||
| 	signature, err := e.pubSub.SignMessage(challenge) |  | ||||||
| 	if err != nil { |  | ||||||
| 		panic(err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = s.Send(&protobufs.CeremonyCompressedSyncRequestMessage{ |  | ||||||
| 		SyncMessage: &protobufs.CeremonyCompressedSyncRequestMessage_Authentication{ |  | ||||||
| 			Authentication: &protobufs.SyncRequestAuthentication{ |  | ||||||
| 				PeerId:    e.pubSub.GetPeerID(), |  | ||||||
| 				Challenge: challenge, |  | ||||||
| 				Response: &protobufs.Ed448Signature{ |  | ||||||
| 					Signature: signature, |  | ||||||
| 					PublicKey: &protobufs.Ed448PublicKey{ |  | ||||||
| 						KeyValue: e.pubSub.GetPublicKey(), |  | ||||||
| 					}, |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 	}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		e.peerMapMx.Lock() |  | ||||||
| 		if _, ok := e.peerMap[string(peerId)]; ok { |  | ||||||
| 			e.uncooperativePeersMap[string(peerId)] = e.peerMap[string(peerId)] |  | ||||||
| 			e.uncooperativePeersMap[string(peerId)].timestamp = time.Now().UnixMilli() |  | ||||||
| 			delete(e.peerMap, string(peerId)) |  | ||||||
| 		} |  | ||||||
| 		e.peerMapMx.Unlock() |  | ||||||
| 		return latest, errors.Wrap(err, "sync") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = s.Send(&protobufs.CeremonyCompressedSyncRequestMessage{ |  | ||||||
| 		SyncMessage: &protobufs.CeremonyCompressedSyncRequestMessage_Preflight{ |  | ||||||
| 			Preflight: &protobufs.ClockFramesPreflight{ |  | ||||||
| 				RangeParentSelectors: rangeParentSelectors, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 	}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		e.peerMapMx.Lock() |  | ||||||
| 		if _, ok := e.peerMap[string(peerId)]; ok { |  | ||||||
| 			e.uncooperativePeersMap[string(peerId)] = e.peerMap[string(peerId)] |  | ||||||
| 			e.uncooperativePeersMap[string(peerId)].timestamp = time.Now().UnixMilli() |  | ||||||
| 			delete(e.peerMap, string(peerId)) |  | ||||||
| 		} |  | ||||||
| 		e.peerMapMx.Unlock() |  | ||||||
| 		return latest, errors.Wrap(err, "sync") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	syncMsg, err := s.Recv() |  | ||||||
| 	if err != nil { |  | ||||||
| 		e.peerMapMx.Lock() |  | ||||||
| 		if _, ok := e.peerMap[string(peerId)]; ok { |  | ||||||
| 			e.uncooperativePeersMap[string(peerId)] = e.peerMap[string(peerId)] |  | ||||||
| 			e.uncooperativePeersMap[string(peerId)].timestamp = time.Now().UnixMilli() |  | ||||||
| 			delete(e.peerMap, string(peerId)) |  | ||||||
| 		} |  | ||||||
| 		e.peerMapMx.Unlock() |  | ||||||
| 		return latest, errors.Wrap(err, "sync") |  | ||||||
| 	} |  | ||||||
| 	preflight, ok := syncMsg. |  | ||||||
| 		SyncMessage.(*protobufs.CeremonyCompressedSyncResponseMessage_Preflight) |  | ||||||
| 	if !ok { |  | ||||||
| 		e.peerMapMx.Lock() |  | ||||||
| 		if _, ok := e.peerMap[string(peerId)]; ok { |  | ||||||
| 			e.uncooperativePeersMap[string(peerId)] = e.peerMap[string(peerId)] |  | ||||||
| 			e.uncooperativePeersMap[string(peerId)].timestamp = time.Now().UnixMilli() |  | ||||||
| 			delete(e.peerMap, string(peerId)) |  | ||||||
| 		} |  | ||||||
| 		e.peerMapMx.Unlock() |  | ||||||
| 		s.CloseSend() |  | ||||||
| 		return latest, errors.Wrap( |  | ||||||
| 			errors.New("preflight message invalid"), |  | ||||||
| 			"sync", |  | ||||||
| 		) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// loop through parent selectors, set found to first match, and if subsequent
 |  | ||||||
| 	// matches fail to be found, cancel the search, start from 1.
 |  | ||||||
| 	found := uint64(0) |  | ||||||
| 	parentSelector := make([]byte, 32) |  | ||||||
| 
 |  | ||||||
| 	for _, selector := range preflight.Preflight.RangeParentSelectors { |  | ||||||
| 		match, err := e.clockStore.GetStagedDataClockFrame( |  | ||||||
| 			e.filter, |  | ||||||
| 			selector.FrameNumber, |  | ||||||
| 			selector.ParentSelector, |  | ||||||
| 			true, |  | ||||||
| 		) |  | ||||||
| 		if err != nil && found == 0 { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		if err != nil && found != 0 { |  | ||||||
| 			found = 1 |  | ||||||
| 			e.logger.Info("could not find interstitial frame, setting search to 1") |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		if match != nil && found == 0 { |  | ||||||
| 			found = match.FrameNumber |  | ||||||
| 			parentSelector = match.ParentSelector |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if found != 0 && !bytes.Equal(parentSelector, make([]byte, 32)) { |  | ||||||
| 		check, err := e.clockStore.GetStagedDataClockFrame( |  | ||||||
| 			e.filter, |  | ||||||
| 			found, |  | ||||||
| 			parentSelector, |  | ||||||
| 			true, |  | ||||||
| 		) |  | ||||||
| 		if err != nil { |  | ||||||
| 			from = 1 |  | ||||||
| 		} else { |  | ||||||
| 			e.logger.Info("checking interstitial continuity") |  | ||||||
| 			for check.FrameNumber > 1 { |  | ||||||
| 				check, err = e.clockStore.GetStagedDataClockFrame( |  | ||||||
| 					e.filter, |  | ||||||
| 					check.FrameNumber-1, |  | ||||||
| 					check.ParentSelector, |  | ||||||
| 					true, |  | ||||||
| 				) |  | ||||||
| 				if err != nil { |  | ||||||
| 					from = 1 |  | ||||||
| 					e.logger.Info( |  | ||||||
| 						"could not confirm interstitial continuity, setting search to 1", |  | ||||||
| 					) |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			from = found |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = s.Send(&protobufs.CeremonyCompressedSyncRequestMessage{ |  | ||||||
| 		SyncMessage: &protobufs.CeremonyCompressedSyncRequestMessage_Request{ |  | ||||||
| 			Request: &protobufs.ClockFramesRequest{ |  | ||||||
| 				Filter:          e.filter, |  | ||||||
| 				FromFrameNumber: from, |  | ||||||
| 				ToFrameNumber:   0, |  | ||||||
| 				ParentSelector:  parentSelector, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 	}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return latest, errors.Wrap(err, "sync") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for syncMsg, err = s.Recv(); err == nil; syncMsg, err = s.Recv() { |  | ||||||
| 		sync, ok := syncMsg. |  | ||||||
| 			SyncMessage.(*protobufs.CeremonyCompressedSyncResponseMessage_Response) |  | ||||||
| 		if !ok { |  | ||||||
| 			return latest, errors.Wrap( |  | ||||||
| 				errors.New("response message invalid"), |  | ||||||
| 				"sync", |  | ||||||
| 			) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		response := sync.Response |  | ||||||
| 
 |  | ||||||
| 		e.logger.Info( |  | ||||||
| 			"received compressed sync frame", |  | ||||||
| 			zap.Uint64("from", response.FromFrameNumber), |  | ||||||
| 			zap.Uint64("to", response.ToFrameNumber), |  | ||||||
| 			zap.Int("frames", len(response.TruncatedClockFrames)), |  | ||||||
| 			zap.Int("proofs", len(response.Proofs)), |  | ||||||
| 		) |  | ||||||
| 
 |  | ||||||
| 		// This can only happen if we get a peer with state that was initially
 |  | ||||||
| 		// farther ahead, but something happened. However, this has a sticking
 |  | ||||||
| 		// effect that doesn't go away for them until they're caught up again,
 |  | ||||||
| 		// so let's not penalize their score and make everyone else suffer,
 |  | ||||||
| 		// let's just move on:
 |  | ||||||
| 		if response.FromFrameNumber == 0 && response.ToFrameNumber == 0 { |  | ||||||
| 			if err := cc.Close(); err != nil { |  | ||||||
| 				e.logger.Error("error while closing connection", zap.Error(err)) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			return currentLatest, errors.Wrap(ErrNoNewFrames, "sync") |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		var next *protobufs.ClockFrame |  | ||||||
| 		if next, err = e.decompressAndStoreCandidates( |  | ||||||
| 			peerId, |  | ||||||
| 			response, |  | ||||||
| 		); err != nil && !errors.Is(err, ErrNoNewFrames) { |  | ||||||
| 			e.logger.Error( |  | ||||||
| 				"could not decompress and store candidate", |  | ||||||
| 				zap.Error(err), |  | ||||||
| 			) |  | ||||||
| 			e.peerMapMx.Lock() |  | ||||||
| 			if _, ok := e.peerMap[string(peerId)]; ok { |  | ||||||
| 				e.uncooperativePeersMap[string(peerId)] = e.peerMap[string(peerId)] |  | ||||||
| 				e.uncooperativePeersMap[string(peerId)].timestamp = time.Now(). |  | ||||||
| 					UnixMilli() |  | ||||||
| 				delete(e.peerMap, string(peerId)) |  | ||||||
| 			} |  | ||||||
| 			e.peerMapMx.Unlock() |  | ||||||
| 
 |  | ||||||
| 			if err := cc.Close(); err != nil { |  | ||||||
| 				e.logger.Error("error while closing connection", zap.Error(err)) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			return currentLatest, errors.Wrap(err, "sync") |  | ||||||
| 		} |  | ||||||
| 		if next != nil { |  | ||||||
| 			latest = next |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if err != nil && err != io.EOF && !errors.Is(err, ErrNoNewFrames) { |  | ||||||
| 		e.logger.Debug("error while receiving sync", zap.Error(err)) |  | ||||||
| 
 |  | ||||||
| 		if err := cc.Close(); err != nil { | 		if err := cc.Close(); err != nil { | ||||||
| 			e.logger.Error("error while closing connection", zap.Error(err)) | 			e.logger.Error("error while closing connection", zap.Error(err)) | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		e.peerMapMx.Lock() |  | ||||||
| 		if _, ok := e.peerMap[string(peerId)]; ok { |  | ||||||
| 			e.uncooperativePeersMap[string(peerId)] = e.peerMap[string(peerId)] |  | ||||||
| 			e.uncooperativePeersMap[string(peerId)].timestamp = time.Now().UnixMilli() |  | ||||||
| 			delete(e.peerMap, string(peerId)) |  | ||||||
| 		} |  | ||||||
| 		e.peerMapMx.Unlock() |  | ||||||
| 
 |  | ||||||
| 		return latest, errors.Wrap(err, "sync") | 		return latest, errors.Wrap(err, "sync") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if response == nil { | ||||||
|  | 		e.logger.Error("received no response from peer") | ||||||
|  | 		if err := cc.Close(); err != nil { | ||||||
|  | 			e.logger.Error("error while closing connection", zap.Error(err)) | ||||||
|  | 		} | ||||||
|  | 		return latest, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	e.logger.Info( | 	e.logger.Info( | ||||||
| 		"received new leading frame", | 		"received new leading frame", | ||||||
| 		zap.Uint64("frame_number", latest.FrameNumber), | 		zap.Uint64("frame_number", response.ClockFrame.FrameNumber), | ||||||
| 	) | 	) | ||||||
| 	if err := cc.Close(); err != nil { | 	if err := cc.Close(); err != nil { | ||||||
| 		e.logger.Error("error while closing connection", zap.Error(err)) | 		e.logger.Error("error while closing connection", zap.Error(err)) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	e.dataTimeReel.Insert(latest, false) | 	e.dataTimeReel.Insert(response.ClockFrame, false) | ||||||
| 
 | 
 | ||||||
| 	return latest, nil | 	return response.ClockFrame, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (e *CeremonyDataClockConsensusEngine) collect( | func (e *CeremonyDataClockConsensusEngine) collect( | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ func (e *CeremonyDataClockConsensusEngine) runMessageHandler() { | |||||||
| 	for { | 	for { | ||||||
| 		select { | 		select { | ||||||
| 		case message := <-e.messageProcessorCh: | 		case message := <-e.messageProcessorCh: | ||||||
|  | 			e.logger.Debug("handling message") | ||||||
| 			msg := &protobufs.Message{} | 			msg := &protobufs.Message{} | ||||||
| 
 | 
 | ||||||
| 			if err := proto.Unmarshal(message.Data, msg); err != nil { | 			if err := proto.Unmarshal(message.Data, msg); err != nil { | ||||||
| @ -84,6 +85,7 @@ func (e *CeremonyDataClockConsensusEngine) runMessageHandler() { | |||||||
| 
 | 
 | ||||||
| 			any := &anypb.Any{} | 			any := &anypb.Any{} | ||||||
| 			if err := proto.Unmarshal(msg.Payload, any); err != nil { | 			if err := proto.Unmarshal(msg.Payload, any); err != nil { | ||||||
|  | 				e.logger.Error("error while unmarshaling", zap.Error(err)) | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| @ -94,6 +96,7 @@ func (e *CeremonyDataClockConsensusEngine) runMessageHandler() { | |||||||
| 						peer.version, | 						peer.version, | ||||||
| 						config.GetMinimumVersion(), | 						config.GetMinimumVersion(), | ||||||
| 					) < 0 { | 					) < 0 { | ||||||
|  | 						e.logger.Debug("received frame from unknown or outdated peer") | ||||||
| 						return | 						return | ||||||
| 					} | 					} | ||||||
| 					if err := e.handleClockFrameData( | 					if err := e.handleClockFrameData( | ||||||
| @ -334,7 +337,10 @@ func (e *CeremonyDataClockConsensusEngine) handleClockFrameData( | |||||||
| 	if e.latestFrameReceived < frame.FrameNumber { | 	if e.latestFrameReceived < frame.FrameNumber { | ||||||
| 		e.latestFrameReceived = frame.FrameNumber | 		e.latestFrameReceived = frame.FrameNumber | ||||||
| 		go func() { | 		go func() { | ||||||
| 			e.frameChan <- frame | 			select { | ||||||
|  | 			case e.frameChan <- frame: | ||||||
|  | 			default: | ||||||
|  | 			} | ||||||
| 		}() | 		}() | ||||||
| 	} | 	} | ||||||
| 	e.dataTimeReel.Insert(frame, isSync) | 	e.dataTimeReel.Insert(frame, isSync) | ||||||
|  | |||||||
| @ -3,14 +3,9 @@ package ceremony | |||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"context" | 	"context" | ||||||
| 	"encoding/binary" |  | ||||||
| 	"io" |  | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	pcrypto "github.com/libp2p/go-libp2p/core/crypto" |  | ||||||
| 	"github.com/libp2p/go-libp2p/core/peer" |  | ||||||
| 	"github.com/mr-tron/base58" | 	"github.com/mr-tron/base58" | ||||||
| 	"github.com/pbnjay/memory" |  | ||||||
| 	"github.com/pkg/errors" | 	"github.com/pkg/errors" | ||||||
| 	"go.uber.org/zap" | 	"go.uber.org/zap" | ||||||
| 	"google.golang.org/grpc" | 	"google.golang.org/grpc" | ||||||
| @ -24,347 +19,63 @@ import ( | |||||||
| 
 | 
 | ||||||
| var ErrNoNewFrames = errors.New("peer reported no frames") | var ErrNoNewFrames = errors.New("peer reported no frames") | ||||||
| 
 | 
 | ||||||
| // Compressed sync negotiation:
 | func (e *CeremonyDataClockConsensusEngine) GetDataFrame( | ||||||
| // Recipients of the sync                                 Servers providing sync
 | 	ctx context.Context, | ||||||
| // |                                                                           |
 | 	request *protobufs.GetDataFrameRequest, | ||||||
| // |---------[Preflight{HEAD, HEAD-16, HEAD-32, HEAD-64, ..., 1}]------------->|
 | ) (*protobufs.DataFrameResponse, error) { | ||||||
| // |<--------[Preflight{HEAD, HEAD-16, HEAD-32, HEAD-64, ..., M}]--------------|
 | 	e.logger.Debug( | ||||||
| // |                    M = matching selector or 1                             |
 | 		"received frame request", | ||||||
| // |------------------------------[Request{N}]-------------------------------->|
 | 		zap.Uint64("frame_number", request.FrameNumber), | ||||||
| // |                    N = matching higher selector or M                      |
 | 	) | ||||||
| // |<-------------------------[Response{N...N+16}]-----------------------------|
 | 	var frame *protobufs.ClockFrame | ||||||
| // |<--------------------------[Response{N+17...}]-----------------------------|
 | 	var err error | ||||||
| // |<--------------------------[Response{...HEAD}]-----------------------------|
 | 	if request.FrameNumber == 0 { | ||||||
|  | 		frame, err = e.dataTimeReel.Head() | ||||||
|  | 	} else { | ||||||
|  | 		frame, _, err = e.clockStore.GetDataClockFrame( | ||||||
|  | 			e.filter, | ||||||
|  | 			request.FrameNumber, | ||||||
|  | 			false, | ||||||
|  | 		) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.logger.Error( | ||||||
|  | 			"received error while fetching time reel head", | ||||||
|  | 			zap.Error(err), | ||||||
|  | 		) | ||||||
|  | 		return nil, errors.Wrap(err, "get data frame") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	idx, err := e.frameProver.GenerateWeakRecursiveProofIndex(frame) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, errors.Wrap(err, "get data frame") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	indexFrame, _, err := e.clockStore.GetDataClockFrame(e.filter, idx, false) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return &protobufs.DataFrameResponse{ | ||||||
|  | 			ClockFrame: frame, | ||||||
|  | 		}, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	proof := e.frameProver.FetchRecursiveProof(indexFrame) | ||||||
|  | 
 | ||||||
|  | 	e.logger.Debug( | ||||||
|  | 		"sending frame response", | ||||||
|  | 		zap.Uint64("frame_number", frame.FrameNumber), | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	return &protobufs.DataFrameResponse{ | ||||||
|  | 		ClockFrame: frame, | ||||||
|  | 		Proof:      proof, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (e *CeremonyDataClockConsensusEngine) NegotiateCompressedSyncFrames( | func (e *CeremonyDataClockConsensusEngine) NegotiateCompressedSyncFrames( | ||||||
| 	server protobufs.CeremonyService_NegotiateCompressedSyncFramesServer, | 	server protobufs.CeremonyService_NegotiateCompressedSyncFramesServer, | ||||||
| ) error { | ) error { | ||||||
| 	e.currentReceivingSyncPeersMx.Lock() | 	return nil | ||||||
| 	if e.currentReceivingSyncPeers > int( |  | ||||||
| 		memory.TotalMemory()/uint64(4294967296)-4, |  | ||||||
| 	) { |  | ||||||
| 		e.currentReceivingSyncPeersMx.Unlock() |  | ||||||
| 
 |  | ||||||
| 		e.logger.Debug( |  | ||||||
| 			"currently processing maximum sync requests, returning", |  | ||||||
| 		) |  | ||||||
| 
 |  | ||||||
| 		if err := server.SendMsg( |  | ||||||
| 			&protobufs.CeremonyCompressedSyncResponseMessage{ |  | ||||||
| 				SyncMessage: &protobufs.CeremonyCompressedSyncResponseMessage_Response{ |  | ||||||
| 					Response: &protobufs.CeremonyCompressedSync{ |  | ||||||
| 						FromFrameNumber: 0, |  | ||||||
| 						ToFrameNumber:   0, |  | ||||||
| 					}, |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 		); err != nil { |  | ||||||
| 			return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	request, err := server.Recv() |  | ||||||
| 	if err == io.EOF { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if err != nil { |  | ||||||
| 		return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	authentication, ok := request. |  | ||||||
| 		SyncMessage.(*protobufs.CeremonyCompressedSyncRequestMessage_Authentication) |  | ||||||
| 	if !ok { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if authentication.Authentication == nil || |  | ||||||
| 		authentication.Authentication.Challenge == nil || |  | ||||||
| 		authentication.Authentication.PeerId == nil || |  | ||||||
| 		authentication.Authentication.Response == nil || |  | ||||||
| 		authentication.Authentication.Response.PublicKey == nil || |  | ||||||
| 		authentication.Authentication.Response.PublicKey.KeyValue == nil || |  | ||||||
| 		authentication.Authentication.Response.Signature == nil || |  | ||||||
| 		len(authentication.Authentication.Challenge) < 8 { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if !bytes.Equal( |  | ||||||
| 		authentication.Authentication.Challenge[:len( |  | ||||||
| 			authentication.Authentication.Challenge, |  | ||||||
| 		)-8], |  | ||||||
| 		e.pubSub.GetPeerID(), |  | ||||||
| 	) { |  | ||||||
| 		e.logger.Warn( |  | ||||||
| 			"peer provided invalid challenge", |  | ||||||
| 		) |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// probably some remark to make about chronometers here, whether one or three
 |  | ||||||
| 	challenge := int64( |  | ||||||
| 		binary.BigEndian.Uint64( |  | ||||||
| 			authentication.Authentication.Challenge[len( |  | ||||||
| 				authentication.Authentication.Challenge, |  | ||||||
| 			)-8:], |  | ||||||
| 		), |  | ||||||
| 	) |  | ||||||
| 	dist := time.Now().UnixMilli() - challenge |  | ||||||
| 	if dist < 0 { |  | ||||||
| 		dist *= -1 |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// account for skew
 |  | ||||||
| 	if dist > 30000 { |  | ||||||
| 		e.logger.Debug( |  | ||||||
| 			"peer provided challenge with too great of a distance", |  | ||||||
| 			zap.Int64("distance", dist), |  | ||||||
| 		) |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	key, err := pcrypto.UnmarshalEd448PublicKey( |  | ||||||
| 		authentication.Authentication.Response.PublicKey.KeyValue, |  | ||||||
| 	) |  | ||||||
| 	if err != nil { |  | ||||||
| 		e.logger.Debug( |  | ||||||
| 			"peer provided invalid pubkey", |  | ||||||
| 			zap.Binary( |  | ||||||
| 				"public_key", |  | ||||||
| 				authentication.Authentication.Response.PublicKey.KeyValue, |  | ||||||
| 			), |  | ||||||
| 		) |  | ||||||
| 		return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if !(peer.ID(authentication.Authentication.PeerId)).MatchesPublicKey(key) { |  | ||||||
| 		e.logger.Debug( |  | ||||||
| 			"peer id does not match pubkey", |  | ||||||
| 			zap.Binary("peer_id", authentication.Authentication.PeerId), |  | ||||||
| 			zap.Binary( |  | ||||||
| 				"public_key", |  | ||||||
| 				authentication.Authentication.Response.PublicKey.KeyValue, |  | ||||||
| 			), |  | ||||||
| 		) |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	b, err := key.Verify( |  | ||||||
| 		authentication.Authentication.Challenge, |  | ||||||
| 		authentication.Authentication.Response.Signature, |  | ||||||
| 	) |  | ||||||
| 	if err != nil || !b { |  | ||||||
| 		e.logger.Debug( |  | ||||||
| 			"peer provided invalid signature", |  | ||||||
| 			zap.Binary("peer_id", authentication.Authentication.PeerId), |  | ||||||
| 			zap.Binary( |  | ||||||
| 				"public_key", |  | ||||||
| 				authentication.Authentication.Response.PublicKey.KeyValue, |  | ||||||
| 			), |  | ||||||
| 			zap.Binary( |  | ||||||
| 				"signature", |  | ||||||
| 				authentication.Authentication.Response.Signature, |  | ||||||
| 			), |  | ||||||
| 		) |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	manifest := e.peerInfoManager.GetPeerInfo( |  | ||||||
| 		authentication.Authentication.PeerId, |  | ||||||
| 	) |  | ||||||
| 	if manifest == nil || manifest.Bandwidth <= 1048576 { |  | ||||||
| 		e.logger.Debug( |  | ||||||
| 			"peer manifest was null or bandwidth was low", |  | ||||||
| 			zap.Binary("peer_id", authentication.Authentication.PeerId), |  | ||||||
| 		) |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// TODO: should give this more tlc, but should remap into blossomsub
 |  | ||||||
| 	// heuristics
 |  | ||||||
| 
 |  | ||||||
| 	e.currentReceivingSyncPeers++ |  | ||||||
| 	e.currentReceivingSyncPeersMx.Unlock() |  | ||||||
| 
 |  | ||||||
| 	defer func() { |  | ||||||
| 		e.currentReceivingSyncPeersMx.Lock() |  | ||||||
| 		e.currentReceivingSyncPeers-- |  | ||||||
| 		e.currentReceivingSyncPeersMx.Unlock() |  | ||||||
| 	}() |  | ||||||
| 
 |  | ||||||
| 	for { |  | ||||||
| 		request, err := server.Recv() |  | ||||||
| 		if err == io.EOF { |  | ||||||
| 			return nil |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if err != nil { |  | ||||||
| 			return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		switch msg := request.SyncMessage.(type) { |  | ||||||
| 		case *protobufs.CeremonyCompressedSyncRequestMessage_Preflight: |  | ||||||
| 			e.logger.Debug( |  | ||||||
| 				"received clock frame preflight", |  | ||||||
| 				zap.Int("selector_count", len(msg.Preflight.RangeParentSelectors)), |  | ||||||
| 			) |  | ||||||
| 
 |  | ||||||
| 			from := uint64(1) |  | ||||||
| 
 |  | ||||||
| 			preflightResponse := []*protobufs.ClockFrameParentSelectors{} |  | ||||||
| 			for _, selector := range msg.Preflight.RangeParentSelectors { |  | ||||||
| 				frame, _, err := e.clockStore.GetDataClockFrame( |  | ||||||
| 					e.filter, |  | ||||||
| 					selector.FrameNumber, |  | ||||||
| 					true, |  | ||||||
| 				) |  | ||||||
| 				if err == nil && frame != nil { |  | ||||||
| 					from = selector.FrameNumber |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			head, err := e.dataTimeReel.Head() |  | ||||||
| 			if err != nil { |  | ||||||
| 				return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			to := head.FrameNumber |  | ||||||
| 			selector, err := head.GetSelector() |  | ||||||
| 			if err != nil { |  | ||||||
| 				return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			preflightResponse = append( |  | ||||||
| 				preflightResponse, |  | ||||||
| 				&protobufs.ClockFrameParentSelectors{ |  | ||||||
| 					FrameNumber:    to, |  | ||||||
| 					ParentSelector: selector.FillBytes(make([]byte, 32)), |  | ||||||
| 				}, |  | ||||||
| 			) |  | ||||||
| 			rangeSubtract := uint64(4) |  | ||||||
| 			for { |  | ||||||
| 				parentNumber := to - uint64(rangeSubtract) |  | ||||||
| 
 |  | ||||||
| 				if parentNumber < from { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 				rangeSubtract *= 2 |  | ||||||
| 				parent, _, err := e.clockStore.GetDataClockFrame( |  | ||||||
| 					e.filter, |  | ||||||
| 					parentNumber, |  | ||||||
| 					true, |  | ||||||
| 				) |  | ||||||
| 				if err != nil { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				parentSelector, err := parent.GetSelector() |  | ||||||
| 				if err != nil { |  | ||||||
| 					return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				preflightResponse = append( |  | ||||||
| 					preflightResponse, |  | ||||||
| 					&protobufs.ClockFrameParentSelectors{ |  | ||||||
| 						FrameNumber:    parent.FrameNumber, |  | ||||||
| 						ParentSelector: parentSelector.FillBytes(make([]byte, 32)), |  | ||||||
| 					}, |  | ||||||
| 				) |  | ||||||
| 			} |  | ||||||
| 			err = server.Send(&protobufs.CeremonyCompressedSyncResponseMessage{ |  | ||||||
| 				SyncMessage: &protobufs.CeremonyCompressedSyncResponseMessage_Preflight{ |  | ||||||
| 					Preflight: &protobufs.ClockFramesPreflight{ |  | ||||||
| 						RangeParentSelectors: preflightResponse, |  | ||||||
| 					}, |  | ||||||
| 				}, |  | ||||||
| 			}) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 			} |  | ||||||
| 		case *protobufs.CeremonyCompressedSyncRequestMessage_Request: |  | ||||||
| 			e.logger.Info( |  | ||||||
| 				"received clock frame request", |  | ||||||
| 				zap.Uint64("from_frame_number", msg.Request.FromFrameNumber), |  | ||||||
| 				zap.Uint64("to_frame_number", msg.Request.ToFrameNumber), |  | ||||||
| 			) |  | ||||||
| 			from := msg.Request.FromFrameNumber |  | ||||||
| 			_, _, err := e.clockStore.GetDataClockFrame( |  | ||||||
| 				e.filter, |  | ||||||
| 				from, |  | ||||||
| 				true, |  | ||||||
| 			) |  | ||||||
| 			if err != nil { |  | ||||||
| 				if !errors.Is(err, store.ErrNotFound) { |  | ||||||
| 					e.logger.Error( |  | ||||||
| 						"peer asked for frame that returned error", |  | ||||||
| 						zap.Uint64("frame_number", msg.Request.FromFrameNumber), |  | ||||||
| 					) |  | ||||||
| 
 |  | ||||||
| 					return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 				} else { |  | ||||||
| 					from = 1 |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			head, err := e.dataTimeReel.Head() |  | ||||||
| 			if err != nil { |  | ||||||
| 				panic(err) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			max := head.FrameNumber |  | ||||||
| 			to := msg.Request.ToFrameNumber |  | ||||||
| 
 |  | ||||||
| 			// We need to slightly rewind, to compensate for unconfirmed frame heads
 |  | ||||||
| 			// on a given branch
 |  | ||||||
| 			if from >= 2 { |  | ||||||
| 				from-- |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			for { |  | ||||||
| 				if to == 0 || to-from > 4 { |  | ||||||
| 					if max > from+3 { |  | ||||||
| 						to = from + 4 |  | ||||||
| 					} else { |  | ||||||
| 						to = max + 1 |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				syncMsg, err := e.clockStore.GetCompressedDataClockFrames( |  | ||||||
| 					e.filter, |  | ||||||
| 					from, |  | ||||||
| 					to, |  | ||||||
| 				) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				if err := server.Send(&protobufs.CeremonyCompressedSyncResponseMessage{ |  | ||||||
| 					SyncMessage: &protobufs. |  | ||||||
| 						CeremonyCompressedSyncResponseMessage_Response{ |  | ||||||
| 						Response: syncMsg, |  | ||||||
| 					}, |  | ||||||
| 				}); err != nil { |  | ||||||
| 					return errors.Wrap(err, "negotiate compressed sync frames") |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				if (msg.Request.ToFrameNumber == 0 || msg.Request.ToFrameNumber > to) && |  | ||||||
| 					max > to { |  | ||||||
| 					from = to + 1 |  | ||||||
| 					if msg.Request.ToFrameNumber > to { |  | ||||||
| 						to = msg.Request.ToFrameNumber |  | ||||||
| 					} else { |  | ||||||
| 						to = 0 |  | ||||||
| 					} |  | ||||||
| 				} else { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			return nil |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Deprecated: Use NegotiateCompressedSyncFrames.
 | // Deprecated: Use NegotiateCompressedSyncFrames.
 | ||||||
|  | |||||||
| @ -123,7 +123,7 @@ func NewMasterClockConsensusEngine( | |||||||
| 		masterTimeReel:      masterTimeReel, | 		masterTimeReel:      masterTimeReel, | ||||||
| 		peerInfoManager:     peerInfoManager, | 		peerInfoManager:     peerInfoManager, | ||||||
| 		report:              report, | 		report:              report, | ||||||
| 		frameValidationCh:   make(chan *protobufs.ClockFrame, 10), | 		frameValidationCh:   make(chan *protobufs.ClockFrame), | ||||||
| 		bandwidthTestCh:     make(chan []byte), | 		bandwidthTestCh:     make(chan []byte), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -135,9 +135,9 @@ func (d *DataTimeReel) Start() error { | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			panic(err) | 			panic(err) | ||||||
| 		} | 		} | ||||||
|  | 		d.totalDistance = big.NewInt(0) | ||||||
| 		d.proverTrie = trie | 		d.proverTrie = trie | ||||||
| 		d.headDistance, err = d.GetDistance(frame) | 		d.headDistance, err = d.GetDistance(frame) | ||||||
| 		d.totalDistance = d.getTotalDistance(frame) |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	go d.runLoop() | 	go d.runLoop() | ||||||
| @ -287,7 +287,11 @@ func (d *DataTimeReel) runLoop() { | |||||||
| 		case frame := <-d.frames: | 		case frame := <-d.frames: | ||||||
| 			// Most common scenario: in order – new frame is higher number
 | 			// Most common scenario: in order – new frame is higher number
 | ||||||
| 			if d.head.FrameNumber < frame.frameNumber { | 			if d.head.FrameNumber < frame.frameNumber { | ||||||
| 				d.logger.Debug("frame is higher") | 				d.logger.Debug( | ||||||
|  | 					"frame is higher", | ||||||
|  | 					zap.Uint64("head_frame_number", d.head.FrameNumber), | ||||||
|  | 					zap.Uint64("frame_number", frame.frameNumber), | ||||||
|  | 				) | ||||||
| 
 | 
 | ||||||
| 				// tag: equinox – master filter changes
 | 				// tag: equinox – master filter changes
 | ||||||
| 				_, err := d.clockStore.GetMasterClockFrame( | 				_, err := d.clockStore.GetMasterClockFrame( | ||||||
| @ -302,17 +306,9 @@ func (d *DataTimeReel) runLoop() { | |||||||
| 					if !errors.Is(err, store.ErrNotFound) { | 					if !errors.Is(err, store.ErrNotFound) { | ||||||
| 						panic(err) | 						panic(err) | ||||||
| 					} | 					} | ||||||
| 
 |  | ||||||
| 					d.addPending(frame.selector, frame.parentSelector, frame.frameNumber) |  | ||||||
| 					d.processPending(d.head, frame) |  | ||||||
| 					continue | 					continue | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				headSelector, err := d.head.GetSelector() |  | ||||||
| 				if err != nil { |  | ||||||
| 					panic(err) |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				rawFrame, err := d.clockStore.GetStagedDataClockFrame( | 				rawFrame, err := d.clockStore.GetStagedDataClockFrame( | ||||||
| 					d.filter, | 					d.filter, | ||||||
| 					frame.frameNumber, | 					frame.frameNumber, | ||||||
| @ -328,25 +324,8 @@ func (d *DataTimeReel) runLoop() { | |||||||
| 					panic(err) | 					panic(err) | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				// If the frame has a gap from the head or is not descendent, mark it as
 |  | ||||||
| 				// pending:
 |  | ||||||
| 				if frame.frameNumber-d.head.FrameNumber != 1 || |  | ||||||
| 					frame.parentSelector.Cmp(headSelector) != 0 { |  | ||||||
| 					d.logger.Debug( |  | ||||||
| 						"frame has has gap or is non-descendent, fork choice", |  | ||||||
| 						zap.Bool("has_gap", frame.frameNumber-d.head.FrameNumber != 1), |  | ||||||
| 						zap.String("parent_selector", frame.parentSelector.Text(16)), |  | ||||||
| 						zap.String("head_selector", headSelector.Text(16)), |  | ||||||
| 					) |  | ||||||
| 
 |  | ||||||
| 					d.forkChoice(rawFrame, distance) |  | ||||||
| 					d.processPending(d.head, frame) |  | ||||||
| 					continue |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				// Otherwise set it as the next and process all pending
 | 				// Otherwise set it as the next and process all pending
 | ||||||
| 				d.setHead(rawFrame, distance) | 				d.setHead(rawFrame, distance) | ||||||
| 				d.processPending(d.head, frame) |  | ||||||
| 			} else if d.head.FrameNumber == frame.frameNumber { | 			} else if d.head.FrameNumber == frame.frameNumber { | ||||||
| 				// frames are equivalent, no need to act
 | 				// frames are equivalent, no need to act
 | ||||||
| 				headSelector, err := d.head.GetSelector() | 				headSelector, err := d.head.GetSelector() | ||||||
| @ -356,7 +335,6 @@ func (d *DataTimeReel) runLoop() { | |||||||
| 
 | 
 | ||||||
| 				if headSelector.Cmp(frame.selector) == 0 { | 				if headSelector.Cmp(frame.selector) == 0 { | ||||||
| 					d.logger.Debug("equivalent frame") | 					d.logger.Debug("equivalent frame") | ||||||
| 					d.processPending(d.head, frame) |  | ||||||
| 					continue | 					continue | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| @ -383,44 +361,11 @@ func (d *DataTimeReel) runLoop() { | |||||||
| 					d.logger.Debug( | 					d.logger.Debug( | ||||||
| 						"frame shares parent, has shorter distance, short circuit", | 						"frame shares parent, has shorter distance, short circuit", | ||||||
| 					) | 					) | ||||||
| 					d.totalDistance.Sub(d.totalDistance, d.headDistance) |  | ||||||
| 					d.setHead(rawFrame, distance) | 					d.setHead(rawFrame, distance) | ||||||
| 					d.processPending(d.head, frame) |  | ||||||
| 					continue | 					continue | ||||||
| 				} | 				} | ||||||
| 
 |  | ||||||
| 				// Choose fork
 |  | ||||||
| 				d.forkChoice(rawFrame, distance) |  | ||||||
| 				d.processPending(d.head, frame) |  | ||||||
| 			} else { | 			} else { | ||||||
| 				d.logger.Debug("frame is lower height") | 				d.logger.Debug("frame is lower height") | ||||||
| 
 |  | ||||||
| 				// tag: dusk – we should have some kind of check here to avoid brutal
 |  | ||||||
| 				// thrashing
 |  | ||||||
| 				existing, _, err := d.clockStore.GetDataClockFrame( |  | ||||||
| 					d.filter, |  | ||||||
| 					frame.frameNumber, |  | ||||||
| 					true, |  | ||||||
| 				) |  | ||||||
| 				if err != nil { |  | ||||||
| 					// if this returns an error it's either not found (which shouldn't
 |  | ||||||
| 					// happen without corruption) or pebble is borked, either way, panic
 |  | ||||||
| 					panic(err) |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				existingSelector, err := existing.GetSelector() |  | ||||||
| 				if err != nil { |  | ||||||
| 					panic(err) |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				// It's a fork, but it's behind. We need to stash it until it catches
 |  | ||||||
| 				// up (or dies off)
 |  | ||||||
| 				if existingSelector.Cmp(frame.selector) != 0 { |  | ||||||
| 					d.logger.Debug("is fork, add pending") |  | ||||||
| 
 |  | ||||||
| 					d.addPending(frame.selector, frame.parentSelector, frame.frameNumber) |  | ||||||
| 					d.processPending(d.head, frame) |  | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
| 		case <-d.done: | 		case <-d.done: | ||||||
| 			return | 			return | ||||||
| @ -616,14 +561,6 @@ func (d *DataTimeReel) setHead(frame *protobufs.ClockFrame, distance *big.Int) { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	d.head = frame | 	d.head = frame | ||||||
| 	d.totalDistance.Add(d.totalDistance, distance) |  | ||||||
| 
 |  | ||||||
| 	d.clockStore.SetTotalDistance( |  | ||||||
| 		d.filter, |  | ||||||
| 		frame.FrameNumber, |  | ||||||
| 		selector.FillBytes(make([]byte, 32)), |  | ||||||
| 		d.totalDistance, |  | ||||||
| 	) |  | ||||||
| 
 | 
 | ||||||
| 	d.headDistance = distance | 	d.headDistance = distance | ||||||
| 	go func() { | 	go func() { | ||||||
|  | |||||||
| @ -40,4 +40,15 @@ type FrameProver interface { | |||||||
| 	VerifyDataClockFrame( | 	VerifyDataClockFrame( | ||||||
| 		frame *protobufs.ClockFrame, | 		frame *protobufs.ClockFrame, | ||||||
| 	) error | 	) error | ||||||
|  | 	GenerateWeakRecursiveProofIndex( | ||||||
|  | 		frame *protobufs.ClockFrame, | ||||||
|  | 	) (uint64, error) | ||||||
|  | 	FetchRecursiveProof( | ||||||
|  | 		frame *protobufs.ClockFrame, | ||||||
|  | 	) []byte | ||||||
|  | 	VerifyWeakRecursiveProof( | ||||||
|  | 		frame *protobufs.ClockFrame, | ||||||
|  | 		proof []byte, | ||||||
|  | 		deepVerifier *protobufs.ClockFrame, | ||||||
|  | 	) bool | ||||||
| } | } | ||||||
|  | |||||||
| @ -481,3 +481,115 @@ func (w *WesolowskiFrameProver) VerifyDataClockFrame( | |||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (w *WesolowskiFrameProver) GenerateWeakRecursiveProofIndex( | ||||||
|  | 	frame *protobufs.ClockFrame, | ||||||
|  | ) (uint64, error) { | ||||||
|  | 	hash, err := poseidon.HashBytes(frame.Output) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, errors.Wrap(err, "generate weak recursive proof") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return hash.Mod( | ||||||
|  | 		hash, | ||||||
|  | 		new(big.Int).SetUint64(frame.FrameNumber), | ||||||
|  | 	).Uint64(), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (w *WesolowskiFrameProver) FetchRecursiveProof( | ||||||
|  | 	frame *protobufs.ClockFrame, | ||||||
|  | ) []byte { | ||||||
|  | 	var pubkey []byte | ||||||
|  | 	ed448PublicKey := frame.GetPublicKeySignatureEd448() | ||||||
|  | 	if ed448PublicKey != nil { | ||||||
|  | 		pubkey = ed448PublicKey.PublicKey.KeyValue | ||||||
|  | 	} else { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	h, err := poseidon.HashBytes(pubkey) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	address := h.Bytes() | ||||||
|  | 	input := []byte{} | ||||||
|  | 	input = append(input, frame.Filter...) | ||||||
|  | 	input = binary.BigEndian.AppendUint64(input, frame.FrameNumber) | ||||||
|  | 	input = binary.BigEndian.AppendUint64(input, uint64(frame.Timestamp)) | ||||||
|  | 	input = binary.BigEndian.AppendUint32(input, frame.Difficulty) | ||||||
|  | 	input = append(input, address...) | ||||||
|  | 	input = append(input, frame.Input...) | ||||||
|  | 	input = append(input, frame.Output...) | ||||||
|  | 
 | ||||||
|  | 	return input | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (w *WesolowskiFrameProver) VerifyWeakRecursiveProof( | ||||||
|  | 	frame *protobufs.ClockFrame, | ||||||
|  | 	proof []byte, | ||||||
|  | 	deepVerifier *protobufs.ClockFrame, | ||||||
|  | ) bool { | ||||||
|  | 	hash, err := poseidon.HashBytes(frame.Output) | ||||||
|  | 	if err != nil { | ||||||
|  | 		w.logger.Debug("could not hash output") | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	frameNumber := hash.Mod( | ||||||
|  | 		hash, | ||||||
|  | 		new(big.Int).SetUint64(frame.FrameNumber), | ||||||
|  | 	).Uint64() | ||||||
|  | 
 | ||||||
|  | 	if len(proof) < 1084 { | ||||||
|  | 		w.logger.Debug("invalid proof size") | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	filter := proof[:len(frame.Filter)] | ||||||
|  | 	check := binary.BigEndian.Uint64(proof[len(frame.Filter) : len(frame.Filter)+8]) | ||||||
|  | 	timestamp := binary.BigEndian.Uint64( | ||||||
|  | 		proof[len(frame.Filter)+8 : len(frame.Filter)+16], | ||||||
|  | 	) | ||||||
|  | 	difficulty := binary.BigEndian.Uint32( | ||||||
|  | 		proof[len(frame.Filter)+16 : len(frame.Filter)+20], | ||||||
|  | 	) | ||||||
|  | 	input := proof[len(frame.Filter)+52:] | ||||||
|  | 
 | ||||||
|  | 	if check != frameNumber || | ||||||
|  | 		!bytes.Equal(filter, frame.Filter) || | ||||||
|  | 		int64(timestamp) >= frame.Timestamp || | ||||||
|  | 		difficulty > frame.Difficulty || | ||||||
|  | 		len(input) < 1032 { | ||||||
|  | 		w.logger.Debug( | ||||||
|  | 			"check failed", | ||||||
|  | 			zap.Bool("failed_frame_number", check != frameNumber), | ||||||
|  | 			zap.Bool("failed_filter", !bytes.Equal(filter, frame.Filter)), | ||||||
|  | 			zap.Bool("failed_timestamp", int64(timestamp) >= frame.Timestamp), | ||||||
|  | 			zap.Bool("failed_difficulty", difficulty > frame.Difficulty), | ||||||
|  | 			zap.Bool("failed_input_size", len(input) < 1032), | ||||||
|  | 		) | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if deepVerifier != nil && (check != deepVerifier.FrameNumber || | ||||||
|  | 		!bytes.Equal(filter, deepVerifier.Filter) || | ||||||
|  | 		int64(timestamp) != deepVerifier.Timestamp || | ||||||
|  | 		difficulty != deepVerifier.Difficulty || | ||||||
|  | 		!bytes.Equal(input[:len(input)-516], deepVerifier.Input)) { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	b := sha3.Sum256(input[:len(input)-516]) | ||||||
|  | 	v := vdf.New(difficulty, b) | ||||||
|  | 	output := [516]byte{} | ||||||
|  | 	copy(output[:], input[len(input)-516:]) | ||||||
|  | 
 | ||||||
|  | 	if v.Verify(output) { | ||||||
|  | 		w.logger.Debug("verification succeeded") | ||||||
|  | 		return true | ||||||
|  | 	} else { | ||||||
|  | 		w.logger.Debug("verification failed") | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
| @ -447,9 +447,7 @@ func (e *CeremonyExecutionEngine) Start() <-chan error { | |||||||
| 			panic(err) | 			panic(err) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		go func() { | 		go e.RunWorker() | ||||||
| 			e.RunWorker() |  | ||||||
| 		}() |  | ||||||
| 
 | 
 | ||||||
| 		errChan <- nil | 		errChan <- nil | ||||||
| 	}() | 	}() | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								node/main.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								node/main.go
									
									
									
									
									
								
							| @ -79,6 +79,11 @@ var ( | |||||||
| 		false, | 		false, | ||||||
| 		"print node related information", | 		"print node related information", | ||||||
| 	) | 	) | ||||||
|  | 	debug = flag.Bool( | ||||||
|  | 		"debug", | ||||||
|  | 		false, | ||||||
|  | 		"sets log output to debug (verbose)", | ||||||
|  | 	) | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func main() { | func main() { | ||||||
| @ -180,7 +185,12 @@ func main() { | |||||||
| 
 | 
 | ||||||
| 	report := RunSelfTestIfNeeded(*configDirectory, nodeConfig) | 	report := RunSelfTestIfNeeded(*configDirectory, nodeConfig) | ||||||
| 
 | 
 | ||||||
| 	node, err := app.NewNode(nodeConfig, report) | 	var node *app.Node | ||||||
|  | 	if *debug { | ||||||
|  | 		node, err = app.NewDebugNode(nodeConfig, report) | ||||||
|  | 	} else { | ||||||
|  | 		node, err = app.NewNode(nodeConfig, report) | ||||||
|  | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		panic(err) | 		panic(err) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -1634,6 +1634,108 @@ func (x *InclusionCommitmentsMap) GetSegmentHashes() [][]byte { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type GetDataFrameRequest struct { | ||||||
|  | 	state         protoimpl.MessageState | ||||||
|  | 	sizeCache     protoimpl.SizeCache | ||||||
|  | 	unknownFields protoimpl.UnknownFields | ||||||
|  | 
 | ||||||
|  | 	FrameNumber uint64 `protobuf:"varint,1,opt,name=frame_number,json=frameNumber,proto3" json:"frame_number,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *GetDataFrameRequest) Reset() { | ||||||
|  | 	*x = GetDataFrameRequest{} | ||||||
|  | 	if protoimpl.UnsafeEnabled { | ||||||
|  | 		mi := &file_ceremony_proto_msgTypes[22] | ||||||
|  | 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||||
|  | 		ms.StoreMessageInfo(mi) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *GetDataFrameRequest) String() string { | ||||||
|  | 	return protoimpl.X.MessageStringOf(x) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (*GetDataFrameRequest) ProtoMessage() {} | ||||||
|  | 
 | ||||||
|  | func (x *GetDataFrameRequest) ProtoReflect() protoreflect.Message { | ||||||
|  | 	mi := &file_ceremony_proto_msgTypes[22] | ||||||
|  | 	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 GetDataFrameRequest.ProtoReflect.Descriptor instead.
 | ||||||
|  | func (*GetDataFrameRequest) Descriptor() ([]byte, []int) { | ||||||
|  | 	return file_ceremony_proto_rawDescGZIP(), []int{22} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *GetDataFrameRequest) GetFrameNumber() uint64 { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.FrameNumber | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type DataFrameResponse struct { | ||||||
|  | 	state         protoimpl.MessageState | ||||||
|  | 	sizeCache     protoimpl.SizeCache | ||||||
|  | 	unknownFields protoimpl.UnknownFields | ||||||
|  | 
 | ||||||
|  | 	ClockFrame *ClockFrame `protobuf:"bytes,1,opt,name=clock_frame,json=clockFrame,proto3" json:"clock_frame,omitempty"` | ||||||
|  | 	Proof      []byte      `protobuf:"bytes,2,opt,name=proof,proto3" json:"proof,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *DataFrameResponse) Reset() { | ||||||
|  | 	*x = DataFrameResponse{} | ||||||
|  | 	if protoimpl.UnsafeEnabled { | ||||||
|  | 		mi := &file_ceremony_proto_msgTypes[23] | ||||||
|  | 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||||
|  | 		ms.StoreMessageInfo(mi) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *DataFrameResponse) String() string { | ||||||
|  | 	return protoimpl.X.MessageStringOf(x) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (*DataFrameResponse) ProtoMessage() {} | ||||||
|  | 
 | ||||||
|  | func (x *DataFrameResponse) ProtoReflect() protoreflect.Message { | ||||||
|  | 	mi := &file_ceremony_proto_msgTypes[23] | ||||||
|  | 	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 DataFrameResponse.ProtoReflect.Descriptor instead.
 | ||||||
|  | func (*DataFrameResponse) Descriptor() ([]byte, []int) { | ||||||
|  | 	return file_ceremony_proto_rawDescGZIP(), []int{23} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *DataFrameResponse) GetClockFrame() *ClockFrame { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.ClockFrame | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (x *DataFrameResponse) GetProof() []byte { | ||||||
|  | 	if x != nil { | ||||||
|  | 		return x.Proof | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| var File_ceremony_proto protoreflect.FileDescriptor | var File_ceremony_proto protoreflect.FileDescriptor | ||||||
| 
 | 
 | ||||||
| var file_ceremony_proto_rawDesc = []byte{ | var file_ceremony_proto_rawDesc = []byte{ | ||||||
| @ -2036,39 +2138,56 @@ var file_ceremony_proto_rawDesc = []byte{ | |||||||
| 	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, | 	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, | ||||||
| 	0x0e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, | 	0x0e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, | ||||||
| 	0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0d, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, | 	0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0d, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, | ||||||
| 	0x73, 0x68, 0x65, 0x73, 0x32, 0xb6, 0x03, 0x0a, 0x0f, 0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, | 	0x73, 0x68, 0x65, 0x73, 0x22, 0x38, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, | ||||||
| 	0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7e, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, | 	0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, | ||||||
| 	0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, | 	0x72, 0x61, 0x6d, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, | ||||||
| 	0x6d, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, | 	0x04, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x70, | ||||||
| 	0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x62, 0x2e, 0x43, | 	0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, | ||||||
| 	0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, | 	0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x61, | ||||||
| 	0x74, 0x1a, 0x33, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, | 	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, | ||||||
| 	0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, | 	0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x63, 0x6b, | ||||||
| 	0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, | 	0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x0a, | ||||||
| 	0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x30, 0x01, 0x12, 0xaa, 0x01, 0x0a, 0x1d, 0x4e, 0x65, 0x67, | 	0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, | ||||||
| 	0x6f, 0x74, 0x69, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, | 	0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, | ||||||
| 	0x53, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x41, 0x2e, 0x71, 0x75, 0x69, | 	0x32, 0xa8, 0x04, 0x0a, 0x0f, 0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x53, 0x65, 0x72, | ||||||
| 	0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, | 	0x76, 0x69, 0x63, 0x65, 0x12, 0x7e, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x72, | ||||||
| 	0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, | 	0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, | ||||||
| 	0x79, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x52, | 	0x2c, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, | ||||||
| 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x42, 0x2e, | 	0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x63, 0x6b, | ||||||
|  | 	0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, | ||||||
| 	0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, | 	0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, | ||||||
| 	0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x65, 0x72, 0x65, | 	0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x65, 0x72, 0x65, | ||||||
| 	0x6d, 0x6f, 0x6e, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, | 	0x6d, 0x6f, 0x6e, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, | ||||||
| 	0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, | 	0x6e, 0x63, 0x30, 0x01, 0x12, 0xaa, 0x01, 0x0a, 0x1d, 0x4e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, | ||||||
| 	0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x76, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, | 	0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, | ||||||
| 	0x69, 0x63, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, | 	0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x41, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, | ||||||
| 	0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, | 	0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, | ||||||
| 	0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x32, 0x50, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, | 	0x79, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x43, 0x6f, 0x6d, | ||||||
| 	0x6c, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x1a, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, | 	0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, | ||||||
| 	0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, | 	0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x42, 0x2e, 0x71, 0x75, 0x69, 0x6c, | ||||||
| 	0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x32, 0x50, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, | 	0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, | ||||||
| 	0x6c, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x3a, 0x5a, | 	0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, | ||||||
| 	0x38, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, | 	0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, | ||||||
| 	0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, | 	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, | ||||||
| 	0x6d, 0x2f, 0x6d, 0x6f, 0x6e, 0x6f, 0x72, 0x65, 0x70, 0x6f, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, | 	0x01, 0x12, 0x76, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x43, 0x68, | ||||||
| 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, | 	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, | ||||||
| 	0x33, | 	0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, | ||||||
|  | 	0x70, 0x62, 0x2e, 0x50, 0x32, 0x50, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x76, | ||||||
|  | 	0x65, 0x6c, 0x6f, 0x70, 0x65, 0x1a, 0x2e, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, | ||||||
|  | 	0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, | ||||||
|  | 	0x70, 0x62, 0x2e, 0x50, 0x32, 0x50, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x76, | ||||||
|  | 	0x65, 0x6c, 0x6f, 0x70, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x70, 0x0a, 0x0c, 0x47, 0x65, 0x74, | ||||||
|  | 	0x44, 0x61, 0x74, 0x61, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x2e, 0x71, 0x75, 0x69, 0x6c, | ||||||
|  | 	0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, 0x72, 0x65, | ||||||
|  | 	0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, | ||||||
|  | 	0x72, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x71, 0x75, | ||||||
|  | 	0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x63, 0x65, | ||||||
|  | 	0x72, 0x65, 0x6d, 0x6f, 0x6e, 0x79, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x46, 0x72, | ||||||
|  | 	0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, | ||||||
|  | 	0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, | ||||||
|  | 	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x2f, | ||||||
|  | 	0x6d, 0x6f, 0x6e, 0x6f, 0x72, 0x65, 0x70, 0x6f, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x70, 0x72, | ||||||
|  | 	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -2083,7 +2202,7 @@ func file_ceremony_proto_rawDescGZIP() []byte { | |||||||
| 	return file_ceremony_proto_rawDescData | 	return file_ceremony_proto_rawDescData | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var file_ceremony_proto_msgTypes = make([]protoimpl.MessageInfo, 22) | var file_ceremony_proto_msgTypes = make([]protoimpl.MessageInfo, 24) | ||||||
| var file_ceremony_proto_goTypes = []interface{}{ | var file_ceremony_proto_goTypes = []interface{}{ | ||||||
| 	(*CeremonyTranscript)(nil),                    // 0: quilibrium.node.ceremony.pb.CeremonyTranscript
 | 	(*CeremonyTranscript)(nil),                    // 0: quilibrium.node.ceremony.pb.CeremonyTranscript
 | ||||||
| 	(*CeremonyLobbyState)(nil),                    // 1: quilibrium.node.ceremony.pb.CeremonyLobbyState
 | 	(*CeremonyLobbyState)(nil),                    // 1: quilibrium.node.ceremony.pb.CeremonyLobbyState
 | ||||||
| @ -2107,80 +2226,85 @@ var file_ceremony_proto_goTypes = []interface{}{ | |||||||
| 	(*InclusionProofsMap)(nil),                    // 19: quilibrium.node.ceremony.pb.InclusionProofsMap
 | 	(*InclusionProofsMap)(nil),                    // 19: quilibrium.node.ceremony.pb.InclusionProofsMap
 | ||||||
| 	(*InclusionSegmentsMap)(nil),                  // 20: quilibrium.node.ceremony.pb.InclusionSegmentsMap
 | 	(*InclusionSegmentsMap)(nil),                  // 20: quilibrium.node.ceremony.pb.InclusionSegmentsMap
 | ||||||
| 	(*InclusionCommitmentsMap)(nil),               // 21: quilibrium.node.ceremony.pb.InclusionCommitmentsMap
 | 	(*InclusionCommitmentsMap)(nil),               // 21: quilibrium.node.ceremony.pb.InclusionCommitmentsMap
 | ||||||
| 	(*BLS48581G1PublicKey)(nil),                   // 22: quilibrium.node.keys.pb.BLS48581G1PublicKey
 | 	(*GetDataFrameRequest)(nil),                   // 22: quilibrium.node.ceremony.pb.GetDataFrameRequest
 | ||||||
| 	(*BLS48581G2PublicKey)(nil),                   // 23: quilibrium.node.keys.pb.BLS48581G2PublicKey
 | 	(*DataFrameResponse)(nil),                     // 23: quilibrium.node.ceremony.pb.DataFrameResponse
 | ||||||
| 	(*Ed448PublicKey)(nil),                        // 24: quilibrium.node.keys.pb.Ed448PublicKey
 | 	(*BLS48581G1PublicKey)(nil),                   // 24: quilibrium.node.keys.pb.BLS48581G1PublicKey
 | ||||||
| 	(*Ed448Signature)(nil),                        // 25: quilibrium.node.keys.pb.Ed448Signature
 | 	(*BLS48581G2PublicKey)(nil),                   // 25: quilibrium.node.keys.pb.BLS48581G2PublicKey
 | ||||||
| 	(*BLS48581Signature)(nil),                     // 26: quilibrium.node.keys.pb.BLS48581Signature
 | 	(*Ed448PublicKey)(nil),                        // 26: quilibrium.node.keys.pb.Ed448PublicKey
 | ||||||
| 	(*X448PublicKey)(nil),                         // 27: quilibrium.node.keys.pb.X448PublicKey
 | 	(*Ed448Signature)(nil),                        // 27: quilibrium.node.keys.pb.Ed448Signature
 | ||||||
| 	(*ClockFrame)(nil),                            // 28: quilibrium.node.clock.pb.ClockFrame
 | 	(*BLS48581Signature)(nil),                     // 28: quilibrium.node.keys.pb.BLS48581Signature
 | ||||||
| 	(*ClockFramesPreflight)(nil),                  // 29: quilibrium.node.clock.pb.ClockFramesPreflight
 | 	(*X448PublicKey)(nil),                         // 29: quilibrium.node.keys.pb.X448PublicKey
 | ||||||
| 	(*ClockFramesRequest)(nil),                    // 30: quilibrium.node.clock.pb.ClockFramesRequest
 | 	(*ClockFrame)(nil),                            // 30: quilibrium.node.clock.pb.ClockFrame
 | ||||||
| 	(*P2PChannelEnvelope)(nil),                    // 31: quilibrium.node.channel.pb.P2PChannelEnvelope
 | 	(*ClockFramesPreflight)(nil),                  // 31: quilibrium.node.clock.pb.ClockFramesPreflight
 | ||||||
|  | 	(*ClockFramesRequest)(nil),                    // 32: quilibrium.node.clock.pb.ClockFramesRequest
 | ||||||
|  | 	(*P2PChannelEnvelope)(nil),                    // 33: quilibrium.node.channel.pb.P2PChannelEnvelope
 | ||||||
| } | } | ||||||
| var file_ceremony_proto_depIdxs = []int32{ | var file_ceremony_proto_depIdxs = []int32{ | ||||||
| 	22, // 0: quilibrium.node.ceremony.pb.CeremonyTranscript.g1_powers:type_name -> quilibrium.node.keys.pb.BLS48581G1PublicKey
 | 	24, // 0: quilibrium.node.ceremony.pb.CeremonyTranscript.g1_powers:type_name -> quilibrium.node.keys.pb.BLS48581G1PublicKey
 | ||||||
| 	23, // 1: quilibrium.node.ceremony.pb.CeremonyTranscript.g2_powers:type_name -> quilibrium.node.keys.pb.BLS48581G2PublicKey
 | 	25, // 1: quilibrium.node.ceremony.pb.CeremonyTranscript.g2_powers:type_name -> quilibrium.node.keys.pb.BLS48581G2PublicKey
 | ||||||
| 	22, // 2: quilibrium.node.ceremony.pb.CeremonyTranscript.running_g1_256_witnesses:type_name -> quilibrium.node.keys.pb.BLS48581G1PublicKey
 | 	24, // 2: quilibrium.node.ceremony.pb.CeremonyTranscript.running_g1_256_witnesses:type_name -> quilibrium.node.keys.pb.BLS48581G1PublicKey
 | ||||||
| 	23, // 3: quilibrium.node.ceremony.pb.CeremonyTranscript.running_g2_256_powers:type_name -> quilibrium.node.keys.pb.BLS48581G2PublicKey
 | 	25, // 3: quilibrium.node.ceremony.pb.CeremonyTranscript.running_g2_256_powers:type_name -> quilibrium.node.keys.pb.BLS48581G2PublicKey
 | ||||||
| 	9,  // 4: quilibrium.node.ceremony.pb.CeremonyLobbyState.ceremony_open_state:type_name -> quilibrium.node.ceremony.pb.CeremonyOpenState
 | 	9,  // 4: quilibrium.node.ceremony.pb.CeremonyLobbyState.ceremony_open_state:type_name -> quilibrium.node.ceremony.pb.CeremonyOpenState
 | ||||||
| 	10, // 5: quilibrium.node.ceremony.pb.CeremonyLobbyState.ceremony_in_progress_state:type_name -> quilibrium.node.ceremony.pb.CeremonyInProgressState
 | 	10, // 5: quilibrium.node.ceremony.pb.CeremonyLobbyState.ceremony_in_progress_state:type_name -> quilibrium.node.ceremony.pb.CeremonyInProgressState
 | ||||||
| 	11, // 6: quilibrium.node.ceremony.pb.CeremonyLobbyState.ceremony_finalizing_state:type_name -> quilibrium.node.ceremony.pb.CeremonyFinalizingState
 | 	11, // 6: quilibrium.node.ceremony.pb.CeremonyLobbyState.ceremony_finalizing_state:type_name -> quilibrium.node.ceremony.pb.CeremonyFinalizingState
 | ||||||
| 	12, // 7: quilibrium.node.ceremony.pb.CeremonyLobbyState.ceremony_validating_state:type_name -> quilibrium.node.ceremony.pb.CeremonyValidatingState
 | 	12, // 7: quilibrium.node.ceremony.pb.CeremonyLobbyState.ceremony_validating_state:type_name -> quilibrium.node.ceremony.pb.CeremonyValidatingState
 | ||||||
| 	0,  // 8: quilibrium.node.ceremony.pb.CeremonyLobbyState.latest_transcript:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscript
 | 	0,  // 8: quilibrium.node.ceremony.pb.CeremonyLobbyState.latest_transcript:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscript
 | ||||||
| 	24, // 9: quilibrium.node.ceremony.pb.CeremonySeenProverAttestation.seen_prover_key:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | 	26, // 9: quilibrium.node.ceremony.pb.CeremonySeenProverAttestation.seen_prover_key:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | ||||||
| 	25, // 10: quilibrium.node.ceremony.pb.CeremonySeenProverAttestation.prover_signature:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | 	27, // 10: quilibrium.node.ceremony.pb.CeremonySeenProverAttestation.prover_signature:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | ||||||
| 	24, // 11: quilibrium.node.ceremony.pb.CeremonyDroppedProverAttestation.dropped_prover_key:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | 	26, // 11: quilibrium.node.ceremony.pb.CeremonyDroppedProverAttestation.dropped_prover_key:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | ||||||
| 	25, // 12: quilibrium.node.ceremony.pb.CeremonyDroppedProverAttestation.prover_signature:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | 	27, // 12: quilibrium.node.ceremony.pb.CeremonyDroppedProverAttestation.prover_signature:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | ||||||
| 	22, // 13: quilibrium.node.ceremony.pb.CeremonyTranscriptShare.additive_g1_powers:type_name -> quilibrium.node.keys.pb.BLS48581G1PublicKey
 | 	24, // 13: quilibrium.node.ceremony.pb.CeremonyTranscriptShare.additive_g1_powers:type_name -> quilibrium.node.keys.pb.BLS48581G1PublicKey
 | ||||||
| 	23, // 14: quilibrium.node.ceremony.pb.CeremonyTranscriptShare.additive_g2_powers:type_name -> quilibrium.node.keys.pb.BLS48581G2PublicKey
 | 	25, // 14: quilibrium.node.ceremony.pb.CeremonyTranscriptShare.additive_g2_powers:type_name -> quilibrium.node.keys.pb.BLS48581G2PublicKey
 | ||||||
| 	22, // 15: quilibrium.node.ceremony.pb.CeremonyTranscriptShare.additive_g1_256_witness:type_name -> quilibrium.node.keys.pb.BLS48581G1PublicKey
 | 	24, // 15: quilibrium.node.ceremony.pb.CeremonyTranscriptShare.additive_g1_256_witness:type_name -> quilibrium.node.keys.pb.BLS48581G1PublicKey
 | ||||||
| 	23, // 16: quilibrium.node.ceremony.pb.CeremonyTranscriptShare.additive_g2_256_witness:type_name -> quilibrium.node.keys.pb.BLS48581G2PublicKey
 | 	25, // 16: quilibrium.node.ceremony.pb.CeremonyTranscriptShare.additive_g2_256_witness:type_name -> quilibrium.node.keys.pb.BLS48581G2PublicKey
 | ||||||
| 	25, // 17: quilibrium.node.ceremony.pb.CeremonyTranscriptShare.prover_signature:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | 	27, // 17: quilibrium.node.ceremony.pb.CeremonyTranscriptShare.prover_signature:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | ||||||
| 	25, // 18: quilibrium.node.ceremony.pb.CeremonyTranscriptCommit.prover_signature:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | 	27, // 18: quilibrium.node.ceremony.pb.CeremonyTranscriptCommit.prover_signature:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | ||||||
| 	26, // 19: quilibrium.node.ceremony.pb.CeremonyTranscriptCommit.contribution_signature:type_name -> quilibrium.node.keys.pb.BLS48581Signature
 | 	28, // 19: quilibrium.node.ceremony.pb.CeremonyTranscriptCommit.contribution_signature:type_name -> quilibrium.node.keys.pb.BLS48581Signature
 | ||||||
| 	5,  // 20: quilibrium.node.ceremony.pb.CeremonyAdvanceRound.commits:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscriptCommit
 | 	5,  // 20: quilibrium.node.ceremony.pb.CeremonyAdvanceRound.commits:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscriptCommit
 | ||||||
| 	27, // 21: quilibrium.node.ceremony.pb.CeremonyLobbyJoin.identity_key:type_name -> quilibrium.node.keys.pb.X448PublicKey
 | 	29, // 21: quilibrium.node.ceremony.pb.CeremonyLobbyJoin.identity_key:type_name -> quilibrium.node.keys.pb.X448PublicKey
 | ||||||
| 	27, // 22: quilibrium.node.ceremony.pb.CeremonyLobbyJoin.signed_pre_key:type_name -> quilibrium.node.keys.pb.X448PublicKey
 | 	29, // 22: quilibrium.node.ceremony.pb.CeremonyLobbyJoin.signed_pre_key:type_name -> quilibrium.node.keys.pb.X448PublicKey
 | ||||||
| 	25, // 23: quilibrium.node.ceremony.pb.CeremonyLobbyJoin.public_key_signature_ed448:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | 	27, // 23: quilibrium.node.ceremony.pb.CeremonyLobbyJoin.public_key_signature_ed448:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | ||||||
| 	7,  // 24: quilibrium.node.ceremony.pb.CeremonyOpenState.joined_participants:type_name -> quilibrium.node.ceremony.pb.CeremonyLobbyJoin
 | 	7,  // 24: quilibrium.node.ceremony.pb.CeremonyOpenState.joined_participants:type_name -> quilibrium.node.ceremony.pb.CeremonyLobbyJoin
 | ||||||
| 	24, // 25: quilibrium.node.ceremony.pb.CeremonyOpenState.preferred_participants:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | 	26, // 25: quilibrium.node.ceremony.pb.CeremonyOpenState.preferred_participants:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | ||||||
| 	7,  // 26: quilibrium.node.ceremony.pb.CeremonyInProgressState.active_participants:type_name -> quilibrium.node.ceremony.pb.CeremonyLobbyJoin
 | 	7,  // 26: quilibrium.node.ceremony.pb.CeremonyInProgressState.active_participants:type_name -> quilibrium.node.ceremony.pb.CeremonyLobbyJoin
 | ||||||
| 	2,  // 27: quilibrium.node.ceremony.pb.CeremonyInProgressState.latest_seen_prover_attestations:type_name -> quilibrium.node.ceremony.pb.CeremonySeenProverAttestation
 | 	2,  // 27: quilibrium.node.ceremony.pb.CeremonyInProgressState.latest_seen_prover_attestations:type_name -> quilibrium.node.ceremony.pb.CeremonySeenProverAttestation
 | ||||||
| 	3,  // 28: quilibrium.node.ceremony.pb.CeremonyInProgressState.dropped_participant_attestations:type_name -> quilibrium.node.ceremony.pb.CeremonyDroppedProverAttestation
 | 	3,  // 28: quilibrium.node.ceremony.pb.CeremonyInProgressState.dropped_participant_attestations:type_name -> quilibrium.node.ceremony.pb.CeremonyDroppedProverAttestation
 | ||||||
| 	6,  // 29: quilibrium.node.ceremony.pb.CeremonyInProgressState.transcript_round_advance_commits:type_name -> quilibrium.node.ceremony.pb.CeremonyAdvanceRound
 | 	6,  // 29: quilibrium.node.ceremony.pb.CeremonyInProgressState.transcript_round_advance_commits:type_name -> quilibrium.node.ceremony.pb.CeremonyAdvanceRound
 | ||||||
| 	24, // 30: quilibrium.node.ceremony.pb.CeremonyInProgressState.next_round_participants:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | 	26, // 30: quilibrium.node.ceremony.pb.CeremonyInProgressState.next_round_participants:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | ||||||
| 	7,  // 31: quilibrium.node.ceremony.pb.CeremonyFinalizingState.active_participants:type_name -> quilibrium.node.ceremony.pb.CeremonyLobbyJoin
 | 	7,  // 31: quilibrium.node.ceremony.pb.CeremonyFinalizingState.active_participants:type_name -> quilibrium.node.ceremony.pb.CeremonyLobbyJoin
 | ||||||
| 	2,  // 32: quilibrium.node.ceremony.pb.CeremonyFinalizingState.latest_seen_prover_attestations:type_name -> quilibrium.node.ceremony.pb.CeremonySeenProverAttestation
 | 	2,  // 32: quilibrium.node.ceremony.pb.CeremonyFinalizingState.latest_seen_prover_attestations:type_name -> quilibrium.node.ceremony.pb.CeremonySeenProverAttestation
 | ||||||
| 	3,  // 33: quilibrium.node.ceremony.pb.CeremonyFinalizingState.dropped_participant_attestations:type_name -> quilibrium.node.ceremony.pb.CeremonyDroppedProverAttestation
 | 	3,  // 33: quilibrium.node.ceremony.pb.CeremonyFinalizingState.dropped_participant_attestations:type_name -> quilibrium.node.ceremony.pb.CeremonyDroppedProverAttestation
 | ||||||
| 	5,  // 34: quilibrium.node.ceremony.pb.CeremonyFinalizingState.commits:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscriptCommit
 | 	5,  // 34: quilibrium.node.ceremony.pb.CeremonyFinalizingState.commits:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscriptCommit
 | ||||||
| 	4,  // 35: quilibrium.node.ceremony.pb.CeremonyFinalizingState.shares:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscriptShare
 | 	4,  // 35: quilibrium.node.ceremony.pb.CeremonyFinalizingState.shares:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscriptShare
 | ||||||
| 	24, // 36: quilibrium.node.ceremony.pb.CeremonyFinalizingState.next_round_participants:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | 	26, // 36: quilibrium.node.ceremony.pb.CeremonyFinalizingState.next_round_participants:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | ||||||
| 	5,  // 37: quilibrium.node.ceremony.pb.CeremonyValidatingState.commits:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscriptCommit
 | 	5,  // 37: quilibrium.node.ceremony.pb.CeremonyValidatingState.commits:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscriptCommit
 | ||||||
| 	0,  // 38: quilibrium.node.ceremony.pb.CeremonyValidatingState.updated_transcript:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscript
 | 	0,  // 38: quilibrium.node.ceremony.pb.CeremonyValidatingState.updated_transcript:type_name -> quilibrium.node.ceremony.pb.CeremonyTranscript
 | ||||||
| 	24, // 39: quilibrium.node.ceremony.pb.CeremonyValidatingState.next_round_participants:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | 	26, // 39: quilibrium.node.ceremony.pb.CeremonyValidatingState.next_round_participants:type_name -> quilibrium.node.keys.pb.Ed448PublicKey
 | ||||||
| 	14, // 40: quilibrium.node.ceremony.pb.CeremonyPeerListAnnounce.peer_list:type_name -> quilibrium.node.ceremony.pb.CeremonyPeer
 | 	14, // 40: quilibrium.node.ceremony.pb.CeremonyPeerListAnnounce.peer_list:type_name -> quilibrium.node.ceremony.pb.CeremonyPeer
 | ||||||
| 	28, // 41: quilibrium.node.ceremony.pb.CeremonyCompressedSync.truncated_clock_frames:type_name -> quilibrium.node.clock.pb.ClockFrame
 | 	30, // 41: quilibrium.node.ceremony.pb.CeremonyCompressedSync.truncated_clock_frames:type_name -> quilibrium.node.clock.pb.ClockFrame
 | ||||||
| 	19, // 42: quilibrium.node.ceremony.pb.CeremonyCompressedSync.proofs:type_name -> quilibrium.node.ceremony.pb.InclusionProofsMap
 | 	19, // 42: quilibrium.node.ceremony.pb.CeremonyCompressedSync.proofs:type_name -> quilibrium.node.ceremony.pb.InclusionProofsMap
 | ||||||
| 	20, // 43: quilibrium.node.ceremony.pb.CeremonyCompressedSync.segments:type_name -> quilibrium.node.ceremony.pb.InclusionSegmentsMap
 | 	20, // 43: quilibrium.node.ceremony.pb.CeremonyCompressedSync.segments:type_name -> quilibrium.node.ceremony.pb.InclusionSegmentsMap
 | ||||||
| 	25, // 44: quilibrium.node.ceremony.pb.SyncRequestAuthentication.response:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | 	27, // 44: quilibrium.node.ceremony.pb.SyncRequestAuthentication.response:type_name -> quilibrium.node.keys.pb.Ed448Signature
 | ||||||
| 	29, // 45: quilibrium.node.ceremony.pb.CeremonyCompressedSyncRequestMessage.preflight:type_name -> quilibrium.node.clock.pb.ClockFramesPreflight
 | 	31, // 45: quilibrium.node.ceremony.pb.CeremonyCompressedSyncRequestMessage.preflight:type_name -> quilibrium.node.clock.pb.ClockFramesPreflight
 | ||||||
| 	30, // 46: quilibrium.node.ceremony.pb.CeremonyCompressedSyncRequestMessage.request:type_name -> quilibrium.node.clock.pb.ClockFramesRequest
 | 	32, // 46: quilibrium.node.ceremony.pb.CeremonyCompressedSyncRequestMessage.request:type_name -> quilibrium.node.clock.pb.ClockFramesRequest
 | ||||||
| 	16, // 47: quilibrium.node.ceremony.pb.CeremonyCompressedSyncRequestMessage.authentication:type_name -> quilibrium.node.ceremony.pb.SyncRequestAuthentication
 | 	16, // 47: quilibrium.node.ceremony.pb.CeremonyCompressedSyncRequestMessage.authentication:type_name -> quilibrium.node.ceremony.pb.SyncRequestAuthentication
 | ||||||
| 	29, // 48: quilibrium.node.ceremony.pb.CeremonyCompressedSyncResponseMessage.preflight:type_name -> quilibrium.node.clock.pb.ClockFramesPreflight
 | 	31, // 48: quilibrium.node.ceremony.pb.CeremonyCompressedSyncResponseMessage.preflight:type_name -> quilibrium.node.clock.pb.ClockFramesPreflight
 | ||||||
| 	15, // 49: quilibrium.node.ceremony.pb.CeremonyCompressedSyncResponseMessage.response:type_name -> quilibrium.node.ceremony.pb.CeremonyCompressedSync
 | 	15, // 49: quilibrium.node.ceremony.pb.CeremonyCompressedSyncResponseMessage.response:type_name -> quilibrium.node.ceremony.pb.CeremonyCompressedSync
 | ||||||
| 	21, // 50: quilibrium.node.ceremony.pb.InclusionProofsMap.commitments:type_name -> quilibrium.node.ceremony.pb.InclusionCommitmentsMap
 | 	21, // 50: quilibrium.node.ceremony.pb.InclusionProofsMap.commitments:type_name -> quilibrium.node.ceremony.pb.InclusionCommitmentsMap
 | ||||||
| 	30, // 51: quilibrium.node.ceremony.pb.CeremonyService.GetCompressedSyncFrames:input_type -> quilibrium.node.clock.pb.ClockFramesRequest
 | 	30, // 51: quilibrium.node.ceremony.pb.DataFrameResponse.clock_frame:type_name -> quilibrium.node.clock.pb.ClockFrame
 | ||||||
| 	17, // 52: quilibrium.node.ceremony.pb.CeremonyService.NegotiateCompressedSyncFrames:input_type -> quilibrium.node.ceremony.pb.CeremonyCompressedSyncRequestMessage
 | 	32, // 52: quilibrium.node.ceremony.pb.CeremonyService.GetCompressedSyncFrames:input_type -> quilibrium.node.clock.pb.ClockFramesRequest
 | ||||||
| 	31, // 53: quilibrium.node.ceremony.pb.CeremonyService.GetPublicChannel:input_type -> quilibrium.node.channel.pb.P2PChannelEnvelope
 | 	17, // 53: quilibrium.node.ceremony.pb.CeremonyService.NegotiateCompressedSyncFrames:input_type -> quilibrium.node.ceremony.pb.CeremonyCompressedSyncRequestMessage
 | ||||||
| 	15, // 54: quilibrium.node.ceremony.pb.CeremonyService.GetCompressedSyncFrames:output_type -> quilibrium.node.ceremony.pb.CeremonyCompressedSync
 | 	33, // 54: quilibrium.node.ceremony.pb.CeremonyService.GetPublicChannel:input_type -> quilibrium.node.channel.pb.P2PChannelEnvelope
 | ||||||
| 	18, // 55: quilibrium.node.ceremony.pb.CeremonyService.NegotiateCompressedSyncFrames:output_type -> quilibrium.node.ceremony.pb.CeremonyCompressedSyncResponseMessage
 | 	22, // 55: quilibrium.node.ceremony.pb.CeremonyService.GetDataFrame:input_type -> quilibrium.node.ceremony.pb.GetDataFrameRequest
 | ||||||
| 	31, // 56: quilibrium.node.ceremony.pb.CeremonyService.GetPublicChannel:output_type -> quilibrium.node.channel.pb.P2PChannelEnvelope
 | 	15, // 56: quilibrium.node.ceremony.pb.CeremonyService.GetCompressedSyncFrames:output_type -> quilibrium.node.ceremony.pb.CeremonyCompressedSync
 | ||||||
| 	54, // [54:57] is the sub-list for method output_type
 | 	18, // 57: quilibrium.node.ceremony.pb.CeremonyService.NegotiateCompressedSyncFrames:output_type -> quilibrium.node.ceremony.pb.CeremonyCompressedSyncResponseMessage
 | ||||||
| 	51, // [51:54] is the sub-list for method input_type
 | 	33, // 58: quilibrium.node.ceremony.pb.CeremonyService.GetPublicChannel:output_type -> quilibrium.node.channel.pb.P2PChannelEnvelope
 | ||||||
| 	51, // [51:51] is the sub-list for extension type_name
 | 	23, // 59: quilibrium.node.ceremony.pb.CeremonyService.GetDataFrame:output_type -> quilibrium.node.ceremony.pb.DataFrameResponse
 | ||||||
| 	51, // [51:51] is the sub-list for extension extendee
 | 	56, // [56:60] is the sub-list for method output_type
 | ||||||
| 	0,  // [0:51] is the sub-list for field type_name
 | 	52, // [52:56] is the sub-list for method input_type
 | ||||||
|  | 	52, // [52:52] is the sub-list for extension type_name
 | ||||||
|  | 	52, // [52:52] is the sub-list for extension extendee
 | ||||||
|  | 	0,  // [0:52] is the sub-list for field type_name
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func init() { file_ceremony_proto_init() } | func init() { file_ceremony_proto_init() } | ||||||
| @ -2456,6 +2580,30 @@ func file_ceremony_proto_init() { | |||||||
| 				return nil | 				return nil | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 		file_ceremony_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { | ||||||
|  | 			switch v := v.(*GetDataFrameRequest); i { | ||||||
|  | 			case 0: | ||||||
|  | 				return &v.state | ||||||
|  | 			case 1: | ||||||
|  | 				return &v.sizeCache | ||||||
|  | 			case 2: | ||||||
|  | 				return &v.unknownFields | ||||||
|  | 			default: | ||||||
|  | 				return nil | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		file_ceremony_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { | ||||||
|  | 			switch v := v.(*DataFrameResponse); i { | ||||||
|  | 			case 0: | ||||||
|  | 				return &v.state | ||||||
|  | 			case 1: | ||||||
|  | 				return &v.sizeCache | ||||||
|  | 			case 2: | ||||||
|  | 				return &v.unknownFields | ||||||
|  | 			default: | ||||||
|  | 				return nil | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	file_ceremony_proto_msgTypes[1].OneofWrappers = []interface{}{ | 	file_ceremony_proto_msgTypes[1].OneofWrappers = []interface{}{ | ||||||
| 		(*CeremonyLobbyState_CeremonyOpenState)(nil), | 		(*CeremonyLobbyState_CeremonyOpenState)(nil), | ||||||
| @ -2478,7 +2626,7 @@ func file_ceremony_proto_init() { | |||||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||||
| 			RawDescriptor: file_ceremony_proto_rawDesc, | 			RawDescriptor: file_ceremony_proto_rawDesc, | ||||||
| 			NumEnums:      0, | 			NumEnums:      0, | ||||||
| 			NumMessages:   22, | 			NumMessages:   24, | ||||||
| 			NumExtensions: 0, | 			NumExtensions: 0, | ||||||
| 			NumServices:   1, | 			NumServices:   1, | ||||||
| 		}, | 		}, | ||||||
|  | |||||||
| @ -142,6 +142,40 @@ func request_CeremonyService_GetPublicChannel_0(ctx context.Context, marshaler r | |||||||
| 	return stream, metadata, nil | 	return stream, metadata, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func request_CeremonyService_GetDataFrame_0(ctx context.Context, marshaler runtime.Marshaler, client CeremonyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||||
|  | 	var protoReq GetDataFrameRequest | ||||||
|  | 	var metadata runtime.ServerMetadata | ||||||
|  | 
 | ||||||
|  | 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||||
|  | 	if berr != nil { | ||||||
|  | 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||||
|  | 	} | ||||||
|  | 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||||
|  | 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	msg, err := client.GetDataFrame(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||||
|  | 	return msg, metadata, err | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func local_request_CeremonyService_GetDataFrame_0(ctx context.Context, marshaler runtime.Marshaler, server CeremonyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||||
|  | 	var protoReq GetDataFrameRequest | ||||||
|  | 	var metadata runtime.ServerMetadata | ||||||
|  | 
 | ||||||
|  | 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||||
|  | 	if berr != nil { | ||||||
|  | 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||||
|  | 	} | ||||||
|  | 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||||
|  | 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	msg, err := server.GetDataFrame(ctx, &protoReq) | ||||||
|  | 	return msg, metadata, err | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // RegisterCeremonyServiceHandlerServer registers the http handlers for service CeremonyService to "mux".
 | // RegisterCeremonyServiceHandlerServer registers the http handlers for service CeremonyService to "mux".
 | ||||||
| // UnaryRPC     :call CeremonyServiceServer directly.
 | // UnaryRPC     :call CeremonyServiceServer directly.
 | ||||||
| // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
 | // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
 | ||||||
| @ -169,6 +203,31 @@ func RegisterCeremonyServiceHandlerServer(ctx context.Context, mux *runtime.Serv | |||||||
| 		return | 		return | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
|  | 	mux.Handle("POST", pattern_CeremonyService_GetDataFrame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||||
|  | 		ctx, cancel := context.WithCancel(req.Context()) | ||||||
|  | 		defer cancel() | ||||||
|  | 		var stream runtime.ServerTransportStream | ||||||
|  | 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) | ||||||
|  | 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||||
|  | 		var err error | ||||||
|  | 		var annotatedContext context.Context | ||||||
|  | 		annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/quilibrium.node.ceremony.pb.CeremonyService/GetDataFrame", runtime.WithHTTPPathPattern("/quilibrium.node.ceremony.pb.CeremonyService/GetDataFrame")) | ||||||
|  | 		if err != nil { | ||||||
|  | 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		resp, md, err := local_request_CeremonyService_GetDataFrame_0(annotatedContext, inboundMarshaler, server, req, pathParams) | ||||||
|  | 		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) | ||||||
|  | 		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) | ||||||
|  | 		if err != nil { | ||||||
|  | 			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		forward_CeremonyService_GetDataFrame_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||||
|  | 
 | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -276,6 +335,28 @@ func RegisterCeremonyServiceHandlerClient(ctx context.Context, mux *runtime.Serv | |||||||
| 
 | 
 | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
|  | 	mux.Handle("POST", pattern_CeremonyService_GetDataFrame_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||||
|  | 		ctx, cancel := context.WithCancel(req.Context()) | ||||||
|  | 		defer cancel() | ||||||
|  | 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||||
|  | 		var err error | ||||||
|  | 		var annotatedContext context.Context | ||||||
|  | 		annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/quilibrium.node.ceremony.pb.CeremonyService/GetDataFrame", runtime.WithHTTPPathPattern("/quilibrium.node.ceremony.pb.CeremonyService/GetDataFrame")) | ||||||
|  | 		if err != nil { | ||||||
|  | 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		resp, md, err := request_CeremonyService_GetDataFrame_0(annotatedContext, inboundMarshaler, client, req, pathParams) | ||||||
|  | 		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) | ||||||
|  | 		if err != nil { | ||||||
|  | 			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		forward_CeremonyService_GetDataFrame_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||||
|  | 
 | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -285,6 +366,8 @@ var ( | |||||||
| 	pattern_CeremonyService_NegotiateCompressedSyncFrames_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"quilibrium.node.ceremony.pb.CeremonyService", "NegotiateCompressedSyncFrames"}, "")) | 	pattern_CeremonyService_NegotiateCompressedSyncFrames_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"quilibrium.node.ceremony.pb.CeremonyService", "NegotiateCompressedSyncFrames"}, "")) | ||||||
| 
 | 
 | ||||||
| 	pattern_CeremonyService_GetPublicChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"quilibrium.node.ceremony.pb.CeremonyService", "GetPublicChannel"}, "")) | 	pattern_CeremonyService_GetPublicChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"quilibrium.node.ceremony.pb.CeremonyService", "GetPublicChannel"}, "")) | ||||||
|  | 
 | ||||||
|  | 	pattern_CeremonyService_GetDataFrame_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"quilibrium.node.ceremony.pb.CeremonyService", "GetDataFrame"}, "")) | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -293,4 +376,6 @@ var ( | |||||||
| 	forward_CeremonyService_NegotiateCompressedSyncFrames_0 = runtime.ForwardResponseStream | 	forward_CeremonyService_NegotiateCompressedSyncFrames_0 = runtime.ForwardResponseStream | ||||||
| 
 | 
 | ||||||
| 	forward_CeremonyService_GetPublicChannel_0 = runtime.ForwardResponseStream | 	forward_CeremonyService_GetPublicChannel_0 = runtime.ForwardResponseStream | ||||||
|  | 
 | ||||||
|  | 	forward_CeremonyService_GetDataFrame_0 = runtime.ForwardResponseMessage | ||||||
| ) | ) | ||||||
|  | |||||||
| @ -189,8 +189,18 @@ message InclusionCommitmentsMap { | |||||||
|   repeated bytes segment_hashes = 3; |   repeated bytes segment_hashes = 3; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | message GetDataFrameRequest { | ||||||
|  |   uint64 frame_number = 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | message DataFrameResponse { | ||||||
|  |   quilibrium.node.clock.pb.ClockFrame clock_frame = 1; | ||||||
|  |   bytes proof = 2; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| service CeremonyService { | service CeremonyService { | ||||||
|   rpc GetCompressedSyncFrames (quilibrium.node.clock.pb.ClockFramesRequest) returns (stream CeremonyCompressedSync); |   rpc GetCompressedSyncFrames (quilibrium.node.clock.pb.ClockFramesRequest) returns (stream CeremonyCompressedSync); | ||||||
|   rpc NegotiateCompressedSyncFrames (stream CeremonyCompressedSyncRequestMessage) returns (stream CeremonyCompressedSyncResponseMessage); |   rpc NegotiateCompressedSyncFrames (stream CeremonyCompressedSyncRequestMessage) returns (stream CeremonyCompressedSyncResponseMessage); | ||||||
|   rpc GetPublicChannel (stream quilibrium.node.channel.pb.P2PChannelEnvelope) returns (stream quilibrium.node.channel.pb.P2PChannelEnvelope); |   rpc GetPublicChannel (stream quilibrium.node.channel.pb.P2PChannelEnvelope) returns (stream quilibrium.node.channel.pb.P2PChannelEnvelope); | ||||||
|  |   rpc GetDataFrame (GetDataFrameRequest) returns (DataFrameResponse); | ||||||
| } | } | ||||||
| @ -22,6 +22,7 @@ const ( | |||||||
| 	CeremonyService_GetCompressedSyncFrames_FullMethodName       = "/quilibrium.node.ceremony.pb.CeremonyService/GetCompressedSyncFrames" | 	CeremonyService_GetCompressedSyncFrames_FullMethodName       = "/quilibrium.node.ceremony.pb.CeremonyService/GetCompressedSyncFrames" | ||||||
| 	CeremonyService_NegotiateCompressedSyncFrames_FullMethodName = "/quilibrium.node.ceremony.pb.CeremonyService/NegotiateCompressedSyncFrames" | 	CeremonyService_NegotiateCompressedSyncFrames_FullMethodName = "/quilibrium.node.ceremony.pb.CeremonyService/NegotiateCompressedSyncFrames" | ||||||
| 	CeremonyService_GetPublicChannel_FullMethodName              = "/quilibrium.node.ceremony.pb.CeremonyService/GetPublicChannel" | 	CeremonyService_GetPublicChannel_FullMethodName              = "/quilibrium.node.ceremony.pb.CeremonyService/GetPublicChannel" | ||||||
|  | 	CeremonyService_GetDataFrame_FullMethodName                  = "/quilibrium.node.ceremony.pb.CeremonyService/GetDataFrame" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // CeremonyServiceClient is the client API for CeremonyService service.
 | // CeremonyServiceClient is the client API for CeremonyService service.
 | ||||||
| @ -31,6 +32,7 @@ type CeremonyServiceClient interface { | |||||||
| 	GetCompressedSyncFrames(ctx context.Context, in *ClockFramesRequest, opts ...grpc.CallOption) (CeremonyService_GetCompressedSyncFramesClient, error) | 	GetCompressedSyncFrames(ctx context.Context, in *ClockFramesRequest, opts ...grpc.CallOption) (CeremonyService_GetCompressedSyncFramesClient, error) | ||||||
| 	NegotiateCompressedSyncFrames(ctx context.Context, opts ...grpc.CallOption) (CeremonyService_NegotiateCompressedSyncFramesClient, error) | 	NegotiateCompressedSyncFrames(ctx context.Context, opts ...grpc.CallOption) (CeremonyService_NegotiateCompressedSyncFramesClient, error) | ||||||
| 	GetPublicChannel(ctx context.Context, opts ...grpc.CallOption) (CeremonyService_GetPublicChannelClient, error) | 	GetPublicChannel(ctx context.Context, opts ...grpc.CallOption) (CeremonyService_GetPublicChannelClient, error) | ||||||
|  | 	GetDataFrame(ctx context.Context, in *GetDataFrameRequest, opts ...grpc.CallOption) (*DataFrameResponse, error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type ceremonyServiceClient struct { | type ceremonyServiceClient struct { | ||||||
| @ -135,6 +137,15 @@ func (x *ceremonyServiceGetPublicChannelClient) Recv() (*P2PChannelEnvelope, err | |||||||
| 	return m, nil | 	return m, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (c *ceremonyServiceClient) GetDataFrame(ctx context.Context, in *GetDataFrameRequest, opts ...grpc.CallOption) (*DataFrameResponse, error) { | ||||||
|  | 	out := new(DataFrameResponse) | ||||||
|  | 	err := c.cc.Invoke(ctx, CeremonyService_GetDataFrame_FullMethodName, in, out, opts...) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return out, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // CeremonyServiceServer is the server API for CeremonyService service.
 | // CeremonyServiceServer is the server API for CeremonyService service.
 | ||||||
| // All implementations must embed UnimplementedCeremonyServiceServer
 | // All implementations must embed UnimplementedCeremonyServiceServer
 | ||||||
| // for forward compatibility
 | // for forward compatibility
 | ||||||
| @ -142,6 +153,7 @@ type CeremonyServiceServer interface { | |||||||
| 	GetCompressedSyncFrames(*ClockFramesRequest, CeremonyService_GetCompressedSyncFramesServer) error | 	GetCompressedSyncFrames(*ClockFramesRequest, CeremonyService_GetCompressedSyncFramesServer) error | ||||||
| 	NegotiateCompressedSyncFrames(CeremonyService_NegotiateCompressedSyncFramesServer) error | 	NegotiateCompressedSyncFrames(CeremonyService_NegotiateCompressedSyncFramesServer) error | ||||||
| 	GetPublicChannel(CeremonyService_GetPublicChannelServer) error | 	GetPublicChannel(CeremonyService_GetPublicChannelServer) error | ||||||
|  | 	GetDataFrame(context.Context, *GetDataFrameRequest) (*DataFrameResponse, error) | ||||||
| 	mustEmbedUnimplementedCeremonyServiceServer() | 	mustEmbedUnimplementedCeremonyServiceServer() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -158,6 +170,9 @@ func (UnimplementedCeremonyServiceServer) NegotiateCompressedSyncFrames(Ceremony | |||||||
| func (UnimplementedCeremonyServiceServer) GetPublicChannel(CeremonyService_GetPublicChannelServer) error { | func (UnimplementedCeremonyServiceServer) GetPublicChannel(CeremonyService_GetPublicChannelServer) error { | ||||||
| 	return status.Errorf(codes.Unimplemented, "method GetPublicChannel not implemented") | 	return status.Errorf(codes.Unimplemented, "method GetPublicChannel not implemented") | ||||||
| } | } | ||||||
|  | func (UnimplementedCeremonyServiceServer) GetDataFrame(context.Context, *GetDataFrameRequest) (*DataFrameResponse, error) { | ||||||
|  | 	return nil, status.Errorf(codes.Unimplemented, "method GetDataFrame not implemented") | ||||||
|  | } | ||||||
| func (UnimplementedCeremonyServiceServer) mustEmbedUnimplementedCeremonyServiceServer() {} | func (UnimplementedCeremonyServiceServer) mustEmbedUnimplementedCeremonyServiceServer() {} | ||||||
| 
 | 
 | ||||||
| // UnsafeCeremonyServiceServer may be embedded to opt out of forward compatibility for this service.
 | // UnsafeCeremonyServiceServer may be embedded to opt out of forward compatibility for this service.
 | ||||||
| @ -244,13 +259,36 @@ func (x *ceremonyServiceGetPublicChannelServer) Recv() (*P2PChannelEnvelope, err | |||||||
| 	return m, nil | 	return m, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func _CeremonyService_GetDataFrame_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||||
|  | 	in := new(GetDataFrameRequest) | ||||||
|  | 	if err := dec(in); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	if interceptor == nil { | ||||||
|  | 		return srv.(CeremonyServiceServer).GetDataFrame(ctx, in) | ||||||
|  | 	} | ||||||
|  | 	info := &grpc.UnaryServerInfo{ | ||||||
|  | 		Server:     srv, | ||||||
|  | 		FullMethod: CeremonyService_GetDataFrame_FullMethodName, | ||||||
|  | 	} | ||||||
|  | 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||||
|  | 		return srv.(CeremonyServiceServer).GetDataFrame(ctx, req.(*GetDataFrameRequest)) | ||||||
|  | 	} | ||||||
|  | 	return interceptor(ctx, in, info, handler) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // CeremonyService_ServiceDesc is the grpc.ServiceDesc for CeremonyService service.
 | // CeremonyService_ServiceDesc is the grpc.ServiceDesc for CeremonyService service.
 | ||||||
| // It's only intended for direct use with grpc.RegisterService,
 | // It's only intended for direct use with grpc.RegisterService,
 | ||||||
| // and not to be introspected or modified (even as a copy)
 | // and not to be introspected or modified (even as a copy)
 | ||||||
| var CeremonyService_ServiceDesc = grpc.ServiceDesc{ | var CeremonyService_ServiceDesc = grpc.ServiceDesc{ | ||||||
| 	ServiceName: "quilibrium.node.ceremony.pb.CeremonyService", | 	ServiceName: "quilibrium.node.ceremony.pb.CeremonyService", | ||||||
| 	HandlerType: (*CeremonyServiceServer)(nil), | 	HandlerType: (*CeremonyServiceServer)(nil), | ||||||
| 	Methods:     []grpc.MethodDesc{}, | 	Methods: []grpc.MethodDesc{ | ||||||
|  | 		{ | ||||||
|  | 			MethodName: "GetDataFrame", | ||||||
|  | 			Handler:    _CeremonyService_GetDataFrame_Handler, | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
| 	Streams: []grpc.StreamDesc{ | 	Streams: []grpc.StreamDesc{ | ||||||
| 		{ | 		{ | ||||||
| 			StreamName:    "GetCompressedSyncFrames", | 			StreamName:    "GetCompressedSyncFrames", | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Cassandra Heart
						Cassandra Heart