Skip to content

Commit 97bf36a

Browse files
Merge remote-tracking branch 'upstream/main'
# Conflicts: # .github/workflows/ci.yml
2 parents 2228fbe + 815aca7 commit 97bf36a

7 files changed

Lines changed: 57 additions & 48 deletions

File tree

.github/workflows/ci.yml

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,12 @@
11
name: CI
2-
3-
on: [push, pull_request]
4-
5-
permissions:
6-
contents: read
2+
on:
3+
push:
4+
branches: [main]
5+
pull_request:
6+
branches: [main]
77

88
jobs:
9-
build-and-test:
10-
runs-on: ubuntu-latest
11-
steps:
12-
- uses: actions/checkout@v4
13-
- uses: actions/setup-go@v5
14-
with:
15-
go-version: '1.24'
16-
- run: go vet ./...
17-
- run: go test -race ./...
18-
- run: go build ./...
19-
20-
lint:
21-
runs-on: ubuntu-latest
22-
steps:
23-
- uses: actions/checkout@v4
24-
- uses: actions/setup-go@v5
25-
with:
26-
go-version: '1.24'
27-
- uses: golangci/golangci-lint-action@v6
28-
with:
29-
version: latest
9+
go:
10+
uses: cogos-dev/.github/.github/workflows/go-ci.yml@main
11+
with:
12+
go-version: '1.24'

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Constellation Protocol — Proof of Concept
22

3+
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
4+
[![Go Report Card](https://goreportcard.com/badge/github.com/cogos-dev/constellation)](https://goreportcard.com/report/github.com/cogos-dev/constellation)
5+
36
A distributed identity protocol where trust is earned through temporal consistency, not granted by authority.
47

58
Each node maintains a hash-chained event ledger in a git repository, broadcasts signed state snapshots to peers, and derives trust from behavioral history rather than certificate authority. Stolen keys are insufficient for impersonation because trust is coupled to the full event chain, not just a credential.

heartbeat.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ func sendHeartbeat(nodeName, addr string, hb *Heartbeat) {
158158
log.Printf("[%s] Heartbeat to %s failed: %v", nodeName, addr, err)
159159
return
160160
}
161-
resp.Body.Close()
161+
_ = resp.Body.Close()
162162
}
163163

164164
func sendJoinRequest(node *Node, addr string) error {
@@ -185,7 +185,7 @@ func sendJoinRequest(node *Node, addr string) error {
185185
if err != nil {
186186
return err
187187
}
188-
defer resp.Body.Close()
188+
defer func() { _ = resp.Body.Close() }()
189189

190190
if resp.StatusCode != http.StatusOK {
191191
return fmt.Errorf("join request returned %d", resp.StatusCode)

identity.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func SaveIdentity(id *NodeIdentity, dir string) error {
4949
if err != nil {
5050
return fmt.Errorf("create key file: %w", err)
5151
}
52-
defer f.Close()
52+
defer func() { _ = f.Close() }()
5353

5454
return pem.Encode(f, &pem.Block{Type: "EC PRIVATE KEY", Bytes: keyDER})
5555
}

node.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,9 @@ func (n *Node) Stop() {
132132
if n.server != nil {
133133
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
134134
defer cancel()
135-
n.server.Shutdown(ctx)
135+
if err := n.server.Shutdown(ctx); err != nil {
136+
log.Printf("[%s] Shutdown error: %v", n.Name, err)
137+
}
136138
}
137139
}
138140

protocol.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ func handlePeers(node *Node) http.HandlerFunc {
9898
}
9999

100100
w.Header().Set("Content-Type", "application/json")
101-
json.NewEncoder(w).Encode(node.Peers.Summarize())
101+
if err := json.NewEncoder(w).Encode(node.Peers.Summarize()); err != nil {
102+
log.Printf("[%s] Failed to encode peers response: %v", node.Name, err)
103+
}
102104
}
103105
}
104106

@@ -125,10 +127,12 @@ func handleChallenge(node *Node) http.HandlerFunc {
125127
}
126128

127129
w.Header().Set("Content-Type", "application/json")
128-
json.NewEncoder(w).Encode(map[string]any{
130+
if err := json.NewEncoder(w).Encode(map[string]any{
129131
"events": events,
130132
"coherence": ValidateCoherence(events),
131-
})
133+
}); err != nil {
134+
log.Printf("[%s] Failed to encode challenge response: %v", node.Name, err)
135+
}
132136
}
133137
}
134138

@@ -171,10 +175,12 @@ func handleJoin(node *Node) http.HandlerFunc {
171175
}
172176

173177
w.Header().Set("Content-Type", "application/json")
174-
json.NewEncoder(w).Encode(map[string]any{
178+
if err := json.NewEncoder(w).Encode(map[string]any{
175179
"status": "accepted",
176180
"peers": peerAddrs,
177-
})
181+
}); err != nil {
182+
log.Printf("[%s] Failed to encode join response: %v", node.Name, err)
183+
}
178184
}
179185
}
180186

@@ -195,7 +201,9 @@ func handleHealth(node *Node) http.HandlerFunc {
195201
if !report.Pass {
196202
w.WriteHeader(http.StatusServiceUnavailable)
197203
}
198-
json.NewEncoder(w).Encode(report)
204+
if err := json.NewEncoder(w).Encode(report); err != nil {
205+
log.Printf("[%s] Failed to encode health response: %v", node.Name, err)
206+
}
199207
}
200208
}
201209

@@ -213,10 +221,12 @@ func handleState(node *Node) http.HandlerFunc {
213221
}
214222

215223
w.Header().Set("Content-Type", "application/json")
216-
json.NewEncoder(w).Encode(map[string]any{
224+
if err := json.NewEncoder(w).Encode(map[string]any{
217225
"state": state,
218226
"peers": node.Peers.Summarize(),
219-
})
227+
}); err != nil {
228+
log.Printf("[%s] Failed to encode state response: %v", node.Name, err)
229+
}
220230
}
221231
}
222232

@@ -245,7 +255,7 @@ func issueChallenge(node *Node, peer *PeerState) {
245255
log.Printf("[%s] Challenge to %s failed: %v", node.Name, FormatNodeID(peer.NodeID), err)
246256
return
247257
}
248-
defer resp.Body.Close()
258+
defer func() { _ = resp.Body.Close() }()
249259

250260
var result struct {
251261
Events []*EventEnvelope `json:"events"`

run.go

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func cmdNode() {
6969
name = args[i]
7070
case "--port":
7171
i++
72-
fmt.Sscanf(args[i], "%d", &port)
72+
_, _ = fmt.Sscanf(args[i], "%d", &port)
7373
case "--peers":
7474
i++
7575
peersStr = args[i]
@@ -145,8 +145,10 @@ func cmdInject() {
145145
fmt.Fprintf(os.Stderr, "inject failed: %v\n", err)
146146
os.Exit(1)
147147
}
148-
defer resp.Body.Close()
149-
io.Copy(os.Stdout, resp.Body)
148+
defer func() { _ = resp.Body.Close() }()
149+
if _, err := io.Copy(os.Stdout, resp.Body); err != nil {
150+
fmt.Fprintf(os.Stderr, "read response failed: %v\n", err)
151+
}
150152
fmt.Println()
151153
}
152154

@@ -173,7 +175,7 @@ func cmdTamper() {
173175
fmt.Fprintf(os.Stderr, "get state failed: %v\n", err)
174176
os.Exit(1)
175177
}
176-
defer resp.Body.Close()
178+
defer func() { _ = resp.Body.Close() }()
177179

178180
var state struct {
179181
State struct {
@@ -213,21 +215,27 @@ func cmdStatus() {
213215
fmt.Fprintf(os.Stderr, "get state failed: %v\n", err)
214216
os.Exit(1)
215217
}
216-
defer stateResp.Body.Close()
218+
defer func() { _ = stateResp.Body.Close() }()
217219

218220
var stateData json.RawMessage
219-
json.NewDecoder(stateResp.Body).Decode(&stateData)
221+
if err := json.NewDecoder(stateResp.Body).Decode(&stateData); err != nil {
222+
fmt.Fprintf(os.Stderr, "decode state failed: %v\n", err)
223+
os.Exit(1)
224+
}
220225

221226
// Get health.
222227
healthResp, err := client.Get(fmt.Sprintf("%s/health", target))
223228
if err != nil {
224229
fmt.Fprintf(os.Stderr, "get health failed: %v\n", err)
225230
os.Exit(1)
226231
}
227-
defer healthResp.Body.Close()
232+
defer func() { _ = healthResp.Body.Close() }()
228233

229234
var healthData json.RawMessage
230-
json.NewDecoder(healthResp.Body).Decode(&healthData)
235+
if err := json.NewDecoder(healthResp.Body).Decode(&healthData); err != nil {
236+
fmt.Fprintf(os.Stderr, "decode health failed: %v\n", err)
237+
os.Exit(1)
238+
}
231239

232240
output := map[string]json.RawMessage{
233241
"state": stateData,
@@ -236,5 +244,8 @@ func cmdStatus() {
236244

237245
enc := json.NewEncoder(os.Stdout)
238246
enc.SetIndent("", " ")
239-
enc.Encode(output)
247+
if err := enc.Encode(output); err != nil {
248+
fmt.Fprintf(os.Stderr, "encode output failed: %v\n", err)
249+
os.Exit(1)
250+
}
240251
}

0 commit comments

Comments
 (0)