Commit f220749a authored by Janoš Guljaš's avatar Janoš Guljaš Committed by GitHub

expose swarm public key in logs and debugapi (#750)

parent d3be5d46
...@@ -7,6 +7,7 @@ package cmd ...@@ -7,6 +7,7 @@ package cmd
import ( import (
"bytes" "bytes"
"context" "context"
"crypto/ecdsa"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
...@@ -130,6 +131,7 @@ Welcome to the Swarm.... Bzzz Bzzzz Bzzzz ...@@ -130,6 +131,7 @@ Welcome to the Swarm.... Bzzz Bzzzz Bzzzz
var signer crypto.Signer var signer crypto.Signer
var address swarm.Address var address swarm.Address
var publicKey *ecdsa.PublicKey
if c.config.GetBool(optionNameClefSignerEnable) { if c.config.GetBool(optionNameClefSignerEnable) {
endpoint := c.config.GetString(optionNameClefSignerEndpoint) endpoint := c.config.GetString(optionNameClefSignerEndpoint)
...@@ -155,7 +157,7 @@ Welcome to the Swarm.... Bzzz Bzzzz Bzzzz ...@@ -155,7 +157,7 @@ Welcome to the Swarm.... Bzzz Bzzzz Bzzzz
return err return err
} }
publicKey, err := signer.PublicKey() publicKey, err = signer.PublicKey()
if err != nil { if err != nil {
return err return err
} }
...@@ -172,9 +174,9 @@ Welcome to the Swarm.... Bzzz Bzzzz Bzzzz ...@@ -172,9 +174,9 @@ Welcome to the Swarm.... Bzzz Bzzzz Bzzzz
return fmt.Errorf("swarm key: %w", err) return fmt.Errorf("swarm key: %w", err)
} }
signer = crypto.NewDefaultSigner(swarmPrivateKey) signer = crypto.NewDefaultSigner(swarmPrivateKey)
publicKey := swarmPrivateKey.PublicKey publicKey = &swarmPrivateKey.PublicKey
address, err = crypto.NewOverlayAddress(publicKey, c.config.GetUint64(optionNameNetworkID)) address, err = crypto.NewOverlayAddress(*publicKey, c.config.GetUint64(optionNameNetworkID))
if err != nil { if err != nil {
return err return err
} }
...@@ -186,7 +188,9 @@ Welcome to the Swarm.... Bzzz Bzzzz Bzzzz ...@@ -186,7 +188,9 @@ Welcome to the Swarm.... Bzzz Bzzzz Bzzzz
} }
} }
b, err := node.NewBee(c.config.GetString(optionNameP2PAddr), address, keystore, signer, c.config.GetUint64(optionNameNetworkID), logger, node.Options{ logger.Infof("swarm public key %x", crypto.EncodeSecp256k1PublicKey(publicKey))
b, err := node.NewBee(c.config.GetString(optionNameP2PAddr), address, *publicKey, keystore, signer, c.config.GetUint64(optionNameNetworkID), logger, node.Options{
DataDir: c.config.GetString(optionNameDataDir), DataDir: c.config.GetString(optionNameDataDir),
DBCapacity: c.config.GetUint64(optionNameDBCapacity), DBCapacity: c.config.GetUint64(optionNameDBCapacity),
Password: password, Password: password,
......
...@@ -28,6 +28,8 @@ components: ...@@ -28,6 +28,8 @@ components:
type: array type: array
items: items:
$ref: '#/components/schemas/P2PUnderlay' $ref: '#/components/schemas/P2PUnderlay'
public_key:
$ref: '#/components/schemas/PublicKey'
Balance: Balance:
type: object type: object
...@@ -190,6 +192,11 @@ components: ...@@ -190,6 +192,11 @@ components:
pattern: '^[A-Fa-f0-9]{64}$' pattern: '^[A-Fa-f0-9]{64}$'
example: "36b7efd913ca4cf880b8eeac5093fa27b0825906c600685b6abdd6566e6cfe8f" example: "36b7efd913ca4cf880b8eeac5093fa27b0825906c600685b6abdd6566e6cfe8f"
PublicKey:
type: string
pattern: '^[A-Fa-f0-9]{66}$'
example: "02ab7473879005929d10ce7d4f626412dad9fe56b0a6622038931d26bd79abf0a4"
SwarmEncryptedReference: SwarmEncryptedReference:
type: string type: string
pattern: '^[A-Fa-f0-9]{128}$' pattern: '^[A-Fa-f0-9]{128}$'
......
...@@ -52,6 +52,11 @@ func EncodeSecp256k1PrivateKey(k *ecdsa.PrivateKey) []byte { ...@@ -52,6 +52,11 @@ func EncodeSecp256k1PrivateKey(k *ecdsa.PrivateKey) []byte {
return (*btcec.PrivateKey)(k).Serialize() return (*btcec.PrivateKey)(k).Serialize()
} }
// EncodeSecp256k1PublicKey encodes raw ECDSA public key in a 33-byte compressed format.
func EncodeSecp256k1PublicKey(k *ecdsa.PublicKey) []byte {
return (*btcec.PublicKey)(k).SerializeCompressed()
}
// DecodeSecp256k1PrivateKey decodes raw ECDSA private key. // DecodeSecp256k1PrivateKey decodes raw ECDSA private key.
func DecodeSecp256k1PrivateKey(data []byte) (*ecdsa.PrivateKey, error) { func DecodeSecp256k1PrivateKey(data []byte) (*ecdsa.PrivateKey, error) {
if l := len(data); l != btcec.PrivKeyBytesLen { if l := len(data); l != btcec.PrivKeyBytesLen {
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package debugapi package debugapi
import ( import (
"crypto/ecdsa"
"net/http" "net/http"
"github.com/ethersphere/bee/pkg/accounting" "github.com/ethersphere/bee/pkg/accounting"
...@@ -28,6 +29,7 @@ type Service interface { ...@@ -28,6 +29,7 @@ type Service interface {
type server struct { type server struct {
Overlay swarm.Address Overlay swarm.Address
PublicKey ecdsa.PublicKey
P2P p2p.DebugService P2P p2p.DebugService
Pingpong pingpong.Interface Pingpong pingpong.Interface
TopologyDriver topology.Driver TopologyDriver topology.Driver
...@@ -43,9 +45,10 @@ type server struct { ...@@ -43,9 +45,10 @@ type server struct {
metricsRegistry *prometheus.Registry metricsRegistry *prometheus.Registry
} }
func New(overlay swarm.Address, p2p p2p.DebugService, pingpong pingpong.Interface, topologyDriver topology.Driver, storer storage.Storer, logger logging.Logger, tracer *tracing.Tracer, tags *tags.Tags, accounting accounting.Interface, settlement settlement.Interface, chequebookEnabled bool, chequebook chequebook.Service) Service { func New(overlay swarm.Address, publicKey ecdsa.PublicKey, p2p p2p.DebugService, pingpong pingpong.Interface, topologyDriver topology.Driver, storer storage.Storer, logger logging.Logger, tracer *tracing.Tracer, tags *tags.Tags, accounting accounting.Interface, settlement settlement.Interface, chequebookEnabled bool, chequebook chequebook.Service) Service {
s := &server{ s := &server{
Overlay: overlay, Overlay: overlay,
PublicKey: publicKey,
P2P: p2p, P2P: p2p,
Pingpong: pingpong, Pingpong: pingpong,
TopologyDriver: topologyDriver, TopologyDriver: topologyDriver,
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package debugapi_test package debugapi_test
import ( import (
"crypto/ecdsa"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
...@@ -29,6 +30,7 @@ import ( ...@@ -29,6 +30,7 @@ import (
type testServerOptions struct { type testServerOptions struct {
Overlay swarm.Address Overlay swarm.Address
PublicKey ecdsa.PublicKey
P2P *p2pmock.Service P2P *p2pmock.Service
Pingpong pingpong.Interface Pingpong pingpong.Interface
Storer storage.Storer Storer storage.Storer
...@@ -50,7 +52,7 @@ func newTestServer(t *testing.T, o testServerOptions) *testServer { ...@@ -50,7 +52,7 @@ func newTestServer(t *testing.T, o testServerOptions) *testServer {
acc := accountingmock.NewAccounting(o.AccountingOpts...) acc := accountingmock.NewAccounting(o.AccountingOpts...)
settlement := settlementmock.NewSettlement(o.SettlementOpts...) settlement := settlementmock.NewSettlement(o.SettlementOpts...)
chequebook := chequebookmock.NewChequebook(o.ChequebookOpts...) chequebook := chequebookmock.NewChequebook(o.ChequebookOpts...)
s := debugapi.New(o.Overlay, o.P2P, o.Pingpong, topologyDriver, o.Storer, logging.New(ioutil.Discard, 0), nil, o.Tags, acc, settlement, true, chequebook) s := debugapi.New(o.Overlay, o.PublicKey, o.P2P, o.Pingpong, topologyDriver, o.Storer, logging.New(ioutil.Discard, 0), nil, o.Tags, acc, settlement, true, chequebook)
ts := httptest.NewServer(s) ts := httptest.NewServer(s)
t.Cleanup(ts.Close) t.Cleanup(ts.Close)
......
...@@ -5,8 +5,10 @@ ...@@ -5,8 +5,10 @@
package debugapi package debugapi
import ( import (
"encoding/hex"
"net/http" "net/http"
"github.com/ethersphere/bee/pkg/crypto"
"github.com/ethersphere/bee/pkg/jsonhttp" "github.com/ethersphere/bee/pkg/jsonhttp"
"github.com/ethersphere/bee/pkg/swarm" "github.com/ethersphere/bee/pkg/swarm"
"github.com/multiformats/go-multiaddr" "github.com/multiformats/go-multiaddr"
...@@ -15,6 +17,7 @@ import ( ...@@ -15,6 +17,7 @@ import (
type addressesResponse struct { type addressesResponse struct {
Overlay swarm.Address `json:"overlay"` Overlay swarm.Address `json:"overlay"`
Underlay []multiaddr.Multiaddr `json:"underlay"` Underlay []multiaddr.Multiaddr `json:"underlay"`
PublicKey string `json:"public_key"`
} }
func (s *server) addressesHandler(w http.ResponseWriter, r *http.Request) { func (s *server) addressesHandler(w http.ResponseWriter, r *http.Request) {
...@@ -27,5 +30,6 @@ func (s *server) addressesHandler(w http.ResponseWriter, r *http.Request) { ...@@ -27,5 +30,6 @@ func (s *server) addressesHandler(w http.ResponseWriter, r *http.Request) {
jsonhttp.OK(w, addressesResponse{ jsonhttp.OK(w, addressesResponse{
Overlay: s.Overlay, Overlay: s.Overlay,
Underlay: underlay, Underlay: underlay,
PublicKey: hex.EncodeToString(crypto.EncodeSecp256k1PublicKey(&s.PublicKey)),
}) })
} }
...@@ -5,10 +5,12 @@ ...@@ -5,10 +5,12 @@
package debugapi_test package debugapi_test
import ( import (
"encoding/hex"
"errors" "errors"
"net/http" "net/http"
"testing" "testing"
"github.com/ethersphere/bee/pkg/crypto"
"github.com/ethersphere/bee/pkg/debugapi" "github.com/ethersphere/bee/pkg/debugapi"
"github.com/ethersphere/bee/pkg/jsonhttp" "github.com/ethersphere/bee/pkg/jsonhttp"
"github.com/ethersphere/bee/pkg/jsonhttp/jsonhttptest" "github.com/ethersphere/bee/pkg/jsonhttp/jsonhttptest"
...@@ -18,6 +20,10 @@ import ( ...@@ -18,6 +20,10 @@ import (
) )
func TestAddresses(t *testing.T) { func TestAddresses(t *testing.T) {
privateKey, err := crypto.GenerateSecp256k1Key()
if err != nil {
t.Fatal(err)
}
overlay := swarm.MustParseHexAddress("ca1e9f3938cc1425c6061b96ad9eb93e134dfe8734ad490164ef20af9d1cf59c") overlay := swarm.MustParseHexAddress("ca1e9f3938cc1425c6061b96ad9eb93e134dfe8734ad490164ef20af9d1cf59c")
addresses := []multiaddr.Multiaddr{ addresses := []multiaddr.Multiaddr{
mustMultiaddr(t, "/ip4/127.0.0.1/tcp/7071/p2p/16Uiu2HAmTBuJT9LvNmBiQiNoTsxE5mtNy6YG3paw79m94CRa9sRb"), mustMultiaddr(t, "/ip4/127.0.0.1/tcp/7071/p2p/16Uiu2HAmTBuJT9LvNmBiQiNoTsxE5mtNy6YG3paw79m94CRa9sRb"),
...@@ -26,6 +32,7 @@ func TestAddresses(t *testing.T) { ...@@ -26,6 +32,7 @@ func TestAddresses(t *testing.T) {
} }
testServer := newTestServer(t, testServerOptions{ testServer := newTestServer(t, testServerOptions{
PublicKey: privateKey.PublicKey,
Overlay: overlay, Overlay: overlay,
P2P: mock.New(mock.WithAddressesFunc(func() ([]multiaddr.Multiaddr, error) { P2P: mock.New(mock.WithAddressesFunc(func() ([]multiaddr.Multiaddr, error) {
return addresses, nil return addresses, nil
...@@ -37,6 +44,7 @@ func TestAddresses(t *testing.T) { ...@@ -37,6 +44,7 @@ func TestAddresses(t *testing.T) {
jsonhttptest.WithExpectedJSONResponse(debugapi.AddressesResponse{ jsonhttptest.WithExpectedJSONResponse(debugapi.AddressesResponse{
Overlay: overlay, Overlay: overlay,
Underlay: addresses, Underlay: addresses,
PublicKey: hex.EncodeToString(crypto.EncodeSecp256k1PublicKey(&privateKey.PublicKey)),
}), }),
) )
}) })
......
...@@ -6,6 +6,7 @@ package node ...@@ -6,6 +6,7 @@ package node
import ( import (
"context" "context"
"crypto/ecdsa"
"errors" "errors"
"fmt" "fmt"
"io" "io"
...@@ -108,7 +109,7 @@ type Options struct { ...@@ -108,7 +109,7 @@ type Options struct {
SwapEnable bool SwapEnable bool
} }
func NewBee(addr string, swarmAddress swarm.Address, keystore keystore.Service, signer crypto.Signer, networkID uint64, logger logging.Logger, o Options) (*Bee, error) { func NewBee(addr string, swarmAddress swarm.Address, publicKey ecdsa.PublicKey, keystore keystore.Service, signer crypto.Signer, networkID uint64, logger logging.Logger, o Options) (*Bee, error) {
tracer, tracerCloser, err := tracing.NewTracer(&tracing.Options{ tracer, tracerCloser, err := tracing.NewTracer(&tracing.Options{
Enabled: o.TracingEnabled, Enabled: o.TracingEnabled,
Endpoint: o.TracingEndpoint, Endpoint: o.TracingEndpoint,
...@@ -437,7 +438,7 @@ func NewBee(addr string, swarmAddress swarm.Address, keystore keystore.Service, ...@@ -437,7 +438,7 @@ func NewBee(addr string, swarmAddress swarm.Address, keystore keystore.Service,
if o.DebugAPIAddr != "" { if o.DebugAPIAddr != "" {
// Debug API server // Debug API server
debugAPIService := debugapi.New(swarmAddress, p2ps, pingPong, kad, storer, logger, tracer, tagg, acc, settlement, o.SwapEnable, chequebookService) debugAPIService := debugapi.New(swarmAddress, publicKey, p2ps, pingPong, kad, storer, logger, tracer, tagg, acc, settlement, o.SwapEnable, chequebookService)
// register metrics from components // register metrics from components
debugAPIService.MustRegisterMetrics(p2ps.Metrics()...) debugAPIService.MustRegisterMetrics(p2ps.Metrics()...)
debugAPIService.MustRegisterMetrics(pingPong.Metrics()...) debugAPIService.MustRegisterMetrics(pingPong.Metrics()...)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment