Skip to content
Snippets Groups Projects
Commit 312c3978 authored by Hans Moog's avatar Hans Moog
Browse files

Feat: heartbeats are now signed + refactors

parent 3ed599aa
No related branches found
No related tags found
No related merge requests found
...@@ -3,6 +3,8 @@ package heartbeat ...@@ -3,6 +3,8 @@ package heartbeat
import ( import (
"sync" "sync"
"golang.org/x/crypto/blake2b"
"github.com/iotaledger/goshimmer/packages/stringify" "github.com/iotaledger/goshimmer/packages/stringify"
"github.com/iotaledger/goshimmer/packages/errors" "github.com/iotaledger/goshimmer/packages/errors"
...@@ -106,6 +108,17 @@ func (opinionStatement *OpinionStatement) GetHash() []byte { ...@@ -106,6 +108,17 @@ func (opinionStatement *OpinionStatement) GetHash() []byte {
opinionStatement.hashMutex.RLock() opinionStatement.hashMutex.RLock()
defer opinionStatement.hashMutex.RUnlock() defer opinionStatement.hashMutex.RUnlock()
if opinionStatement.hash == nil {
marshaledStatement, marshalErr := opinionStatement.MarshalBinary()
if marshalErr != nil {
panic(marshalErr)
}
hash := blake2b.Sum256(marshaledStatement)
opinionStatement.hash = hash[:]
}
return opinionStatement.hash return opinionStatement.hash
} }
......
...@@ -16,7 +16,7 @@ type HeartbeatManager struct { ...@@ -16,7 +16,7 @@ type HeartbeatManager struct {
options *HeartbeatManagerOptions options *HeartbeatManagerOptions
statementChain *StatementChain statementChain *StatementChain
neighborManagers map[string]*NeighborManager neighborManagers map[string]*NeighborManager
initialOpinions map[string][]byte initialOpinions map[string]bool
neighborManagersMutex sync.RWMutex neighborManagersMutex sync.RWMutex
} }
...@@ -28,23 +28,29 @@ func NewHeartbeatManager(identity *identity.Identity, options ...HeartbeatManage ...@@ -28,23 +28,29 @@ func NewHeartbeatManager(identity *identity.Identity, options ...HeartbeatManage
statementChain: NewStatementChain(), statementChain: NewStatementChain(),
neighborManagers: make(map[string]*NeighborManager), neighborManagers: make(map[string]*NeighborManager),
initialOpinions: make(map[string][]byte), initialOpinions: make(map[string]bool),
} }
} }
func (heartbeatManager *HeartbeatManager) SetInitialOpinion(transactionId []byte) { func (heartbeatManager *HeartbeatManager) InitialDislike(transactionId []byte) {
heartbeatManager.initialOpinions[string(transactionId)] = transactionId heartbeatManager.initialOpinions[string(transactionId)] = false
}
func (heartbeatManager *HeartbeatManager) InitialLike(transactionId []byte) {
heartbeatManager.initialOpinions[string(transactionId)] = true
} }
func (heartbeatManager *HeartbeatManager) GenerateMainStatement() (result *heartbeat.OpinionStatement, err errors.IdentifiableError) { func (heartbeatManager *HeartbeatManager) GenerateMainStatement() (result *heartbeat.OpinionStatement, err errors.IdentifiableError) {
toggledTransactions := make([]*heartbeat.ToggledTransaction, 0) toggledTransactions := make([]*heartbeat.ToggledTransaction, 0)
for _, transactionId := range heartbeatManager.initialOpinions { for transactionId, liked := range heartbeatManager.initialOpinions {
newToggledTransaction := heartbeat.NewToggledTransaction() if !liked {
newToggledTransaction.SetInitialStatement(true) newToggledTransaction := heartbeat.NewToggledTransaction()
newToggledTransaction.SetFinalStatement(false) newToggledTransaction.SetInitialStatement(true)
newToggledTransaction.SetTransactionId(transactionId) newToggledTransaction.SetFinalStatement(false)
newToggledTransaction.SetTransactionId([]byte(transactionId))
toggledTransactions = append(toggledTransactions, newToggledTransaction)
toggledTransactions = append(toggledTransactions, newToggledTransaction)
}
} }
mainStatement := heartbeat.NewOpinionStatement() mainStatement := heartbeat.NewOpinionStatement()
...@@ -66,15 +72,24 @@ func (heartbeatManager *HeartbeatManager) GenerateMainStatement() (result *heart ...@@ -66,15 +72,24 @@ func (heartbeatManager *HeartbeatManager) GenerateMainStatement() (result *heart
signature, signingErr := heartbeatManager.identity.Sign(marshaledStatement) signature, signingErr := heartbeatManager.identity.Sign(marshaledStatement)
if signingErr != nil { if signingErr != nil {
err = ErrMalformedHeartbeat.Derive(signingErr.Error()) err = ErrMalformedHeartbeat.Derive(signingErr.Error())
return
} }
mainStatement.SetSignature(signature) mainStatement.SetSignature(signature)
result = mainStatement result = mainStatement
heartbeatManager.ResetInitialStatements()
heartbeatManager.statementChain.lastAppliedStatement = mainStatement
return return
} }
func (heartbeatManager *HeartbeatManager) ResetInitialStatements() {
heartbeatManager.initialOpinions = make(map[string]bool)
}
func (heartbeatManager *HeartbeatManager) GenerateHeartbeat() (result *heartbeat.Heartbeat, err errors.IdentifiableError) { func (heartbeatManager *HeartbeatManager) GenerateHeartbeat() (result *heartbeat.Heartbeat, err errors.IdentifiableError) {
mainStatement, mainStatementErr := heartbeatManager.GenerateMainStatement() mainStatement, mainStatementErr := heartbeatManager.GenerateMainStatement()
if mainStatementErr != nil { if mainStatementErr != nil {
...@@ -87,7 +102,20 @@ func (heartbeatManager *HeartbeatManager) GenerateHeartbeat() (result *heartbeat ...@@ -87,7 +102,20 @@ func (heartbeatManager *HeartbeatManager) GenerateHeartbeat() (result *heartbeat
generatedHeartbeat.SetNodeId(heartbeatManager.identity.StringIdentifier) generatedHeartbeat.SetNodeId(heartbeatManager.identity.StringIdentifier)
generatedHeartbeat.SetMainStatement(mainStatement) generatedHeartbeat.SetMainStatement(mainStatement)
generatedHeartbeat.SetNeighborStatements(nil) generatedHeartbeat.SetNeighborStatements(nil)
generatedHeartbeat.SetSignature(nil)
marshaledHeartbeat, marshalErr := generatedHeartbeat.MarshalBinary()
if marshalErr != nil {
err = marshalErr
return
}
signature, signingErr := heartbeatManager.identity.Sign(marshaledHeartbeat)
if signingErr != nil {
err = ErrMalformedHeartbeat.Derive(signingErr.Error())
return
}
generatedHeartbeat.SetSignature(signature)
result = generatedHeartbeat result = generatedHeartbeat
......
...@@ -8,16 +8,22 @@ import ( ...@@ -8,16 +8,22 @@ import (
"github.com/iotaledger/goshimmer/packages/identity" "github.com/iotaledger/goshimmer/packages/identity"
) )
func TestHeartbeatManager_GenerateHeartbeat(t *testing.T) { func generateRandomTransactionId() (result []byte) {
transactionId1 := make([]byte, 50) result = make([]byte, 50)
rand.Read(transactionId1) rand.Read(result)
return
}
transactionId2 := make([]byte, 50) func TestHeartbeatManager_GenerateHeartbeat(t *testing.T) {
rand.Read(transactionId2) transactionId1 := generateRandomTransactionId()
transactionId2 := generateRandomTransactionId()
heartbeatManager := NewHeartbeatManager(identity.GenerateRandomIdentity()) heartbeatManager := NewHeartbeatManager(identity.GenerateRandomIdentity())
heartbeatManager.SetInitialOpinion(transactionId1) heartbeatManager.InitialDislike(transactionId1)
heartbeatManager.SetInitialOpinion(transactionId2) heartbeatManager.InitialDislike(transactionId2)
heartbeatManager.InitialLike(generateRandomTransactionId())
result, err := heartbeatManager.GenerateHeartbeat() result, err := heartbeatManager.GenerateHeartbeat()
if err != nil { if err != nil {
...@@ -27,4 +33,13 @@ func TestHeartbeatManager_GenerateHeartbeat(t *testing.T) { ...@@ -27,4 +33,13 @@ func TestHeartbeatManager_GenerateHeartbeat(t *testing.T) {
} }
fmt.Println(result) fmt.Println(result)
result, err = heartbeatManager.GenerateHeartbeat()
if err != nil {
t.Error(err)
return
}
fmt.Println(result)
} }
...@@ -31,7 +31,7 @@ func sliceReflect(value reflect.Value) (result string) { ...@@ -31,7 +31,7 @@ func sliceReflect(value reflect.Value) (result string) {
} }
} }
if !newLineVersion { if !newLineVersion && len(result) >= 2 {
result = result[:len(result)-2] result = result[:len(result)-2]
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment