initial commit

This commit is contained in:
Zach Kelling
2026-07-26 10:19:05 -07:00
committed by zeekay
parent 2313d84f08
commit eb270d8d50
35 changed files with 554 additions and 380 deletions
+16 -16
View File
@@ -6,18 +6,18 @@ package keys
import ( import (
"fmt" "fmt"
"github.com/luxfi/address"
"github.com/luxfi/constants" "github.com/luxfi/constants"
"github.com/luxfi/node/utils/formatting/address"
) )
// Unit constants for LUX amounts // Unit constants for LUX amounts
const ( const (
MicroLux uint64 = 1 // Base unit (6 decimals) MicroLux uint64 = 1 // Base unit (6 decimals)
Lux uint64 = 1_000_000 // 10^6 microLux Lux uint64 = 1_000_000 // 10^6 microLux
KiloLux uint64 = 1_000 * Lux // 10^9 KiloLux uint64 = 1_000 * Lux // 10^9
MegaLux uint64 = 1_000_000 * Lux // 10^12 MegaLux uint64 = 1_000_000 * Lux // 10^12
GigaLux uint64 = 1_000_000_000 * Lux // 10^15 (1B LUX) GigaLux uint64 = 1_000_000_000 * Lux // 10^15 (1B LUX)
TeraLux uint64 = 1_000_000_000_000 * Lux // 10^18 (1T LUX) TeraLux uint64 = 1_000_000_000_000 * Lux // 10^18 (1T LUX)
// C-chain uses 18 decimals (wei), P/X-chain use 6 decimals // C-chain uses 18 decimals (wei), P/X-chain use 6 decimals
// Multiply P-chain amount by this to get C-chain wei // Multiply P-chain amount by this to get C-chain wei
@@ -53,9 +53,9 @@ type LockedAmount struct {
// Staker represents an initial validator in genesis // Staker represents an initial validator in genesis
type Staker struct { type Staker struct {
NodeID string `json:"nodeID"` NodeID string `json:"nodeID"`
RewardAddress string `json:"rewardAddress"` RewardAddress string `json:"rewardAddress"`
DelegationFee uint32 `json:"delegationFee"` DelegationFee uint32 `json:"delegationFee"`
Signer *Signer `json:"signer,omitempty"` Signer *Signer `json:"signer,omitempty"`
} }
@@ -109,9 +109,9 @@ func NewAllocationBuilder(networkID uint32, keys []*ValidatorKey) *AllocationBui
amountPerKey: DefaultValidatorStake, amountPerKey: DefaultValidatorStake,
feeAccountIndex: 0, feeAccountIndex: 0,
feeAccountExtra: DefaultFeeAccountAmount, feeAccountExtra: DefaultFeeAccountAmount,
vestingStart: 1577836800, // Jan 1, 2020 vestingStart: 1577836800, // Jan 1, 2020
vestingInterval: 365 * 24 * 60 * 60, // 1 year vestingInterval: 365 * 24 * 60 * 60, // 1 year
vestingPeriods: 100, // 100 years vestingPeriods: 100, // 100 years
noVesting: false, noVesting: false,
} }
} }
@@ -254,7 +254,7 @@ func QuickAllocations(networkID uint32, keys []*ValidatorKey, amountPerKey uint6
// TestnetAllocations creates allocations suitable for testnet (no vesting) // TestnetAllocations creates allocations suitable for testnet (no vesting)
func TestnetAllocations(networkID uint32, keys []*ValidatorKey) (*GenesisAllocations, error) { func TestnetAllocations(networkID uint32, keys []*ValidatorKey) (*GenesisAllocations, error) {
return NewAllocationBuilder(networkID, keys). return NewAllocationBuilder(networkID, keys).
WithAmount(100*MegaLux). // 100M LUX per validator WithAmount(100 * MegaLux). // 100M LUX per validator
WithFeeAccount(0, 10*MegaLux). // First validator gets extra WithFeeAccount(0, 10*MegaLux). // First validator gets extra
WithNoVesting(). WithNoVesting().
Build() Build()
@@ -265,9 +265,9 @@ func MainnetAllocations(networkID uint32, keys []*ValidatorKey) (*GenesisAllocat
return NewAllocationBuilder(networkID, keys). return NewAllocationBuilder(networkID, keys).
WithAmount(GigaLux). // 1B LUX per validator WithAmount(GigaLux). // 1B LUX per validator
WithVesting( WithVesting(
1577836800, // Jan 1, 2020 1577836800, // Jan 1, 2020
365*24*60*60, // 1 year intervals 365*24*60*60, // 1 year intervals
100, // 100 periods 100, // 100 periods
). ).
Build() Build()
} }
+18 -28
View File
@@ -1,41 +1,31 @@
module github.com/luxfi/keys module github.com/luxfi/keys
go 1.26.4 go 1.25.5
require ( require (
github.com/luxfi/address v1.0.1 github.com/luxfi/constants v1.2.3
github.com/luxfi/constants v1.5.8 github.com/luxfi/crypto v1.17.25
github.com/luxfi/crypto v1.20.0 github.com/luxfi/ids v1.2.4
github.com/luxfi/go-bip32 v1.1.0 github.com/luxfi/node v1.22.37
github.com/luxfi/go-bip39 v1.2.0 golang.org/x/crypto v0.46.0
github.com/luxfi/ids v1.3.0
github.com/luxfi/protocol v0.0.2
github.com/luxfi/tls v1.0.3
golang.org/x/crypto v0.52.0
) )
require ( require (
github.com/btcsuite/btcd/btcutil v1.1.6 // indirect github.com/btcsuite/btcd/btcutil v1.1.6 // indirect
github.com/cloudflare/circl v1.6.3 // indirect github.com/cloudflare/circl v1.6.2-0.20251204010831-23491bd573cf // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
github.com/google/renameio/v2 v2.0.0 // indirect
github.com/gorilla/rpc v1.2.1 // indirect github.com/gorilla/rpc v1.2.1 // indirect
github.com/holiman/uint256 v1.3.2 // indirect github.com/klauspost/compress v1.18.0 // indirect
github.com/luxfi/accel v1.2.4 // indirect github.com/luxfi/cache v1.0.0 // indirect
github.com/luxfi/cache v1.2.1 // indirect github.com/luxfi/consensus v1.22.35 // indirect
github.com/luxfi/container v0.0.4 // indirect github.com/luxfi/math v1.0.2 // indirect
github.com/luxfi/formatting v1.0.1 // indirect github.com/luxfi/mock v0.1.0 // indirect
github.com/luxfi/geth v1.16.98 // indirect github.com/luxfi/utils v1.0.0 // indirect
github.com/luxfi/math v1.4.1 // indirect
github.com/luxfi/math/big v0.1.0 // indirect
github.com/luxfi/metric v1.5.7 // indirect
github.com/luxfi/mock v0.1.1 // indirect
github.com/luxfi/sampler v1.1.0 // indirect
github.com/luxfi/vm v1.2.0 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect
github.com/supranational/blst v0.3.16 // indirect github.com/supranational/blst v0.3.16 // indirect
go.uber.org/mock v0.6.0 // indirect go.uber.org/mock v0.6.0 // indirect
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect
golang.org/x/sys v0.45.0 // indirect golang.org/x/sys v0.39.0 // indirect
gonum.org/v1/gonum v0.17.0 // indirect gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect
) )
+38 -56
View File
@@ -22,8 +22,8 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku
github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= github.com/cloudflare/circl v1.6.2-0.20251204010831-23491bd573cf h1:+0huF756d72ZdHxachRP5HYmvRkkOk8CLyKUmJM138c=
github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= github.com/cloudflare/circl v1.6.2-0.20251204010831-23491bd573cf/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -33,8 +33,8 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn
github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8=
github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3hK/4HUq48LQ6Wwqo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
@@ -49,56 +49,36 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4=
github.com/gorilla/rpc v1.2.1 h1:yC+LMV5esttgpVvNORL/xX4jvTTEUE30UZhZ5JF7K9k= github.com/gorilla/rpc v1.2.1 h1:yC+LMV5esttgpVvNORL/xX4jvTTEUE30UZhZ5JF7K9k=
github.com/gorilla/rpc v1.2.1/go.mod h1:uNpOihAlF5xRFLuTYhfR0yfCTm0WTQSQttkMSptRfGk= github.com/gorilla/rpc v1.2.1/go.mod h1:uNpOihAlF5xRFLuTYhfR0yfCTm0WTQSQttkMSptRfGk=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA=
github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/luxfi/accel v1.2.4 h1:5VbIHyEvvfobn2zBiTFODxDw1CeqxCepZOLlvkuf9yQ= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/luxfi/accel v1.2.4/go.mod h1:ISIwAX+ZfsL/S5nsP2JvfldXN6Nc+QzoWf6Jtaq+xsQ= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/luxfi/address v1.0.1 h1:Sc4keyuVzBIvHr7uVeYZf2/WY9YDGUgDi/iiWenj49g= github.com/luxfi/cache v1.0.0 h1:OcqGi/qs9ky+7O8fR6WMZtFsunvA40LBTg3QRQqJurs=
github.com/luxfi/address v1.0.1/go.mod h1:5j3Eh66v9zvv1GbNdZwt+23krV8JlSDaRzmWZU8ZRM0= github.com/luxfi/cache v1.0.0/go.mod h1:BEvpffvV3SXs/KSa9nUC1TszxKwUdIHwIaoXpeiYU+Y=
github.com/luxfi/cache v1.2.1 h1:kAzOS55/hmYeNKR+0HAKv4ma48Y6JjkI8UQeqdZ8bfI= github.com/luxfi/consensus v1.22.35 h1:ZJOEITtoy5pT9OkT+z+9qulbsVNFdcdsUAibCtXSoF4=
github.com/luxfi/cache v1.2.1/go.mod h1:co7JTxZZHpKT31Yh01LFp5aZOxmoUg157FhBLQdQHVU= github.com/luxfi/consensus v1.22.35/go.mod h1:/sNvvKfESWfq57Jmrf22T2GquLNg6PU9m9MJ3wqfoYU=
github.com/luxfi/constants v1.5.8 h1:iNP9AWNUcM4Tps7jYnx49CwtCWAC9mYRxJfGou2za0g= github.com/luxfi/constants v1.2.3 h1:ewo3Ch6AJDI3G42J0rlNAdZU1Fv96YEyOmp3E2K/pzE=
github.com/luxfi/constants v1.5.8/go.mod h1:Pu5jWHdnUtQRbWC43yTUjU/pbIIKMDOd2a2yroSfo48= github.com/luxfi/constants v1.2.3/go.mod h1:r5WL5Z03I9iHo910pHykO+RuDCwe4jy0rBSueG1l1mo=
github.com/luxfi/container v0.0.4 h1:BXhF82WyfqVP5mjlNcr7tP0Fcnvl0Ap1rkiu+rq5XuM= github.com/luxfi/crypto v1.17.25 h1:emTejQ17bGj/1tu0ETB196Hbn6fJfo8wUNGIOWit6RM=
github.com/luxfi/container v0.0.4/go.mod h1:Z3SpmMF5d4t77MM0nHYXURpn+EMVaeu1fhbd/3BGaek= github.com/luxfi/crypto v1.17.25/go.mod h1:v6eaW5ejuzW2gecChWKQqx4CtVhoM1b+e40ro/6WVPg=
github.com/luxfi/crypto v1.20.0 h1:JNsQ25sVO6T8XuIHRue4akOpnt5pNmk1xg5hzmU6dNE= github.com/luxfi/ids v1.2.4 h1:e0OaeSI6xWjS9JnxxxfvCCs9HHDUrwDc3M9ctIhjcDI=
github.com/luxfi/crypto v1.20.0/go.mod h1:bLCBuIV/KDjPytld7jSYe1WbfWknPQXcivq88Qo96QU= github.com/luxfi/ids v1.2.4/go.mod h1:HwvRJSNbuZS+u+0JqeHfPX2S13iFyLCnfGxjBCmt244=
github.com/luxfi/formatting v1.0.1 h1:ZnE1rAdEUds9yAegdVdGDOBGN6hLMPOv6E03Fp8IEYo= github.com/luxfi/math v1.0.2 h1:bgBGmVC7S/QxLCgAJZJdvjFHMNXygcApcKofIn7bWpU=
github.com/luxfi/formatting v1.0.1/go.mod h1:mYzNf5DJOiqSSKUPzNj5dKy4tstFbN3pZlkI5716eKc= github.com/luxfi/math v1.0.2/go.mod h1:2Jk1/s0f0yN2q0Sx/cBExbFJz7IDEbjxlP3VUiaujms=
github.com/luxfi/geth v1.16.98 h1:w187TtKuGStf3tm2bshuHVKBv2Frjx0lT54kQVXyNHA= github.com/luxfi/mock v0.1.0 h1:IwElfNu+T9sXvzFX6tudPDx1vqPuACRSRdxpD5lxW+o=
github.com/luxfi/geth v1.16.98/go.mod h1:6kEzSExdk9CPQDPXALt6P3HfQqBq7KF1Jrrv9gBpxbU= github.com/luxfi/mock v0.1.0/go.mod h1:izF+9K0gGzFC9zERn6Po37v46eLdPB+EIsDjL3GLk+U=
github.com/luxfi/go-bip32 v1.1.0 h1:zjy19WKa1KJnGamRNyOZM3l/MPtV/sax7M4NMPwLHZQ= github.com/luxfi/node v1.22.37 h1:njIPH9hmX+TphoxsjSEEWtICfrPxfu4/3ak4zg6A8kM=
github.com/luxfi/go-bip32 v1.1.0/go.mod h1:QyDXlzWL3xRiCbMUi4Z3J52Q/SMoCvdRLXXlYvSZor8= github.com/luxfi/node v1.22.37/go.mod h1:d31vDerMnDBlid/YmKz1M+i/hBfBismLQn4jR8UAFeQ=
github.com/luxfi/go-bip39 v1.2.0 h1:fx3pFuSGawCG4In6pA4OLLStqbgIqD1j8EygFskoHzY= github.com/luxfi/utils v1.0.0 h1:eibxyw/xkwnB9KRSmYvKLbdLTUElyfJpxLIBeTBKqlU=
github.com/luxfi/go-bip39 v1.2.0/go.mod h1:if+2OVbG4k4jKIuBt/Rse1KV1kgWQM5j5xFbUtwbNtc= github.com/luxfi/utils v1.0.0/go.mod h1:ABqhBdGNig0CaDcnNYldv1byS0BTNi5IKPbJSPF1p98=
github.com/luxfi/ids v1.3.0 h1:11xnwRDm6zQzbqcRnkFujOYkvhK4Fs/+g+sKRlRUNsU=
github.com/luxfi/ids v1.3.0/go.mod h1:6vpdcdZW0qxeade+3xby8aLTutbcJ7O0r8+fNQrksGI=
github.com/luxfi/math v1.4.1 h1:1t9bCCsEqnl9yIKrShlbs80DBKyYTWdnzkVfBqEeO7Q=
github.com/luxfi/math v1.4.1/go.mod h1:QvbRxauQyE1w4lvbcLSe6c8yeJz2Zj1Bq1rayGgs2tA=
github.com/luxfi/math/big v0.1.0 h1:Vz4c0RsZVPdIKPsHPgAJChH/R3p15WHRUz7LkLf+NIQ=
github.com/luxfi/math/big v0.1.0/go.mod h1:BuxSu22RbO93xBLk5Eam5nldFponoJ73xDFz4uJ3Huk=
github.com/luxfi/metric v1.5.7 h1:LoSPEUpak2SLcynF+LT2cXjl9ECp4nY+Lia9zudmDv4=
github.com/luxfi/metric v1.5.7/go.mod h1:CMguEhyuLi4YUWyXimJ+UHply99BDFrL0pxedB7rBqM=
github.com/luxfi/mock v0.1.1 h1:0HEtIjg1J6CWz+IUyP6rsGqNWTcmxjFnSQIhaDuARwY=
github.com/luxfi/mock v0.1.1/go.mod h1:jo35akl3Vtd8LbzDts8VJ0jmSVycrd1/eBi6g6t5hKU=
github.com/luxfi/protocol v0.0.2 h1:TAuXMm1K4VDpG3B3brq1EE9Lb7XlbhQmVBObskgNhmc=
github.com/luxfi/protocol v0.0.2/go.mod h1:Yjn2VRwn5PXim0+JTalAyrVG6YbmuSnYOfeUXSbAsqA=
github.com/luxfi/sampler v1.1.0 h1:u3iRDl7V06ARh0e85h3HT+aZ1saCFo2yMMsh+dCJbqk=
github.com/luxfi/sampler v1.1.0/go.mod h1:kJa53S3tC9+VSbuV3RFu68MmbCCBlr2UM39LOClQ/Hs=
github.com/luxfi/tls v1.0.3 h1:rK3nxSAxrUOOSHOZnKChwV4f6UJ+cfOl8KWJXAQx/SI=
github.com/luxfi/tls v1.0.3/go.mod h1:dQqSiGE7YxXUxOwICoReUuIitBms9DYOaCeteBwmIWw=
github.com/luxfi/vm v1.2.0 h1:jTwQRHdC9VmyRZTPSn+IqjMju7f6xlxLc6P9CEg+Y2M=
github.com/luxfi/vm v1.2.0/go.mod h1:qasVIBRerVQuvy9vFGrX3H8X8pPMPG5un/KbZSyq5YY=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
@@ -113,6 +93,8 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo=
github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -125,15 +107,17 @@ github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD
github.com/supranational/blst v0.3.16 h1:bTDadT+3fK497EvLdWRQEjiGnUtzJ7jjIUMF0jqwYhE= github.com/supranational/blst v0.3.16 h1:bTDadT+3fK497EvLdWRQEjiGnUtzJ7jjIUMF0jqwYhE=
github.com/supranational/blst v0.3.16/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/supranational/blst v0.3.16/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
github.com/thepudds/fzgen v0.4.3 h1:srUP/34BulQaEwPP/uHZkdjUcUjIzL7Jkf4CBVryiP8=
github.com/thepudds/fzgen v0.4.3/go.mod h1:BhhwtRhzgvLWAjjcHDJ9pEiLD2Z9hrVIFjBCHJ//zJ4=
go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0=
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -149,24 +133,22 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+26 -277
View File
@@ -10,22 +10,19 @@ package keys
import ( import (
"crypto/ecdsa" "crypto/ecdsa"
"crypto/elliptic"
"encoding/base64" "encoding/base64"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"math/big"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/luxfi/crypto/bls"
"github.com/luxfi/crypto/bls/signer/localsigner" "github.com/luxfi/crypto/bls/signer/localsigner"
luxcrypto "github.com/luxfi/crypto/secp256k1" luxcrypto "github.com/luxfi/crypto/secp256k1"
"github.com/luxfi/go-bip32"
"github.com/luxfi/go-bip39"
"github.com/luxfi/ids" "github.com/luxfi/ids"
"github.com/luxfi/protocol/p/signer" "github.com/luxfi/node/staking"
luxtls "github.com/luxfi/tls" "github.com/luxfi/node/vms/platformvm/signer"
"golang.org/x/crypto/sha3" "golang.org/x/crypto/sha3"
) )
@@ -75,7 +72,7 @@ func GenerateValidatorKey() (*ValidatorKey, error) {
vk := &ValidatorKey{} vk := &ValidatorKey{}
// 1. Generate TLS staking key // 1. Generate TLS staking key
certPEM, keyPEM, err := luxtls.NewCertAndKeyBytes() certPEM, keyPEM, err := staking.NewCertAndKeyBytes()
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to generate TLS cert: %w", err) return nil, fmt.Errorf("failed to generate TLS cert: %w", err)
} }
@@ -84,7 +81,7 @@ func GenerateValidatorKey() (*ValidatorKey, error) {
vk.StakerKey = keyPEM vk.StakerKey = keyPEM
// Parse cert to derive NodeID // Parse cert to derive NodeID
tlsCert, err := luxtls.LoadTLSCertFromBytes(keyPEM, certPEM) tlsCert, err := staking.LoadTLSCertFromBytes(keyPEM, certPEM)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to parse TLS cert: %w", err) return nil, fmt.Errorf("failed to parse TLS cert: %w", err)
} }
@@ -214,46 +211,32 @@ func (ks *KeyStore) Load(name string) (*ValidatorKey, error) {
func LoadFromDir(nodeDir string) (*ValidatorKey, error) { func LoadFromDir(nodeDir string) (*ValidatorKey, error) {
vk := &ValidatorKey{} vk := &ValidatorKey{}
// Load TLS cert - try modern path first, then legacy // Load TLS cert - try modern path first
certPath := filepath.Join(nodeDir, "staking", "staker.crt") certPath := filepath.Join(nodeDir, "staking", "staker.crt")
certPEM, err := os.ReadFile(certPath) certPEM, err := os.ReadFile(certPath)
if err != nil { if err != nil {
certPath = filepath.Join(nodeDir, "staker.crt") certPath = filepath.Join(nodeDir, "staker.crt")
certPEM, err = os.ReadFile(certPath) certPEM, err = os.ReadFile(certPath)
}
// Load TLS key
keyPath := filepath.Join(nodeDir, "staking", "staker.key")
keyPEM, kerr := os.ReadFile(keyPath)
if kerr != nil {
keyPath = filepath.Join(nodeDir, "staker.key")
keyPEM, kerr = os.ReadFile(keyPath)
}
// If TLS cert/key missing, generate them and persist
if err != nil || kerr != nil || len(certPEM) == 0 || len(keyPEM) == 0 {
fmt.Printf(" Generating TLS staking cert for %s\n", filepath.Base(nodeDir))
certPEM, keyPEM, err = luxtls.NewCertAndKeyBytes()
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to generate TLS cert: %w", err) return nil, fmt.Errorf("failed to read staker.crt: %w", err)
}
// Save to disk for future use
stakingDir := filepath.Join(nodeDir, "staking")
if err := os.MkdirAll(stakingDir, 0700); err != nil {
return nil, fmt.Errorf("failed to create staking dir: %w", err)
}
if err := os.WriteFile(filepath.Join(stakingDir, "staker.key"), keyPEM, 0600); err != nil {
return nil, fmt.Errorf("failed to write staker.key: %w", err)
}
if err := os.WriteFile(filepath.Join(stakingDir, "staker.crt"), certPEM, 0644); err != nil {
return nil, fmt.Errorf("failed to write staker.crt: %w", err)
} }
} }
vk.StakerCert = certPEM vk.StakerCert = certPEM
// Load TLS key
keyPath := filepath.Join(nodeDir, "staking", "staker.key")
keyPEM, err := os.ReadFile(keyPath)
if err != nil {
keyPath = filepath.Join(nodeDir, "staker.key")
keyPEM, err = os.ReadFile(keyPath)
if err != nil {
return nil, fmt.Errorf("failed to read staker.key: %w", err)
}
}
vk.StakerKey = keyPEM vk.StakerKey = keyPEM
// Derive NodeID from TLS cert // Derive NodeID from TLS cert
tlsCert, err := luxtls.LoadTLSCertFromBytes(keyPEM, certPEM) tlsCert, err := staking.LoadTLSCertFromBytes(keyPEM, certPEM)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to load TLS cert: %w", err) return nil, fmt.Errorf("failed to load TLS cert: %w", err)
} }
@@ -272,15 +255,13 @@ func LoadFromDir(nodeDir string) (*ValidatorKey, error) {
} }
if len(signerBytes) > 0 { if len(signerBytes) > 0 {
vk.BLSSecretKey = signerBytes vk.BLSSecretKey = signerBytes
// Derive public key and PoP using localsigner + signer.NewProofOfPossession // Derive public key and PoP
// This must match how keys are generated in GenerateValidatorKey/DeriveValidatorFromMnemonic sk, err := bls.SecretKeyFromBytes(signerBytes)
blsSigner, err := localsigner.FromBytes(signerBytes)
if err == nil { if err == nil {
pop, err := signer.NewProofOfPossession(blsSigner) pk := bls.PublicFromSecretKey(sk)
if err == nil { vk.BLSPublicKey = bls.PublicKeyToCompressedBytes(pk)
vk.BLSPublicKey = pop.PublicKey[:] sig := bls.Sign(sk, vk.BLSPublicKey)
vk.BLSPoP = pop.ProofOfPossession[:] vk.BLSPoP = bls.SignatureToBytes(sig)
}
} }
} }
@@ -328,16 +309,7 @@ func (ks *KeyStore) List() ([]string, error) {
var names []string var names []string
for _, entry := range entries { for _, entry := range entries {
if entry.IsDir() { if entry.IsDir() {
name := entry.Name() names = append(names, entry.Name())
// Skip hidden directories (like .git) and non-node directories
if strings.HasPrefix(name, ".") {
continue
}
// Only include node* directories
if !strings.HasPrefix(name, "node") {
continue
}
names = append(names, name)
} }
} }
return names, nil return names, nil
@@ -398,226 +370,3 @@ func (vk *ValidatorKey) BLSPoPHex() string {
func (vk *ValidatorKey) CChainAddrHex() string { func (vk *ValidatorKey) CChainAddrHex() string {
return "0x" + hex.EncodeToString(vk.CChainAddr[:]) return "0x" + hex.EncodeToString(vk.CChainAddr[:])
} }
// DeriveValidatorsFromMnemonic derives N validator keys from a BIP39 mnemonic.
// Each validator uses BIP44 path m/44'/60'/0'/0/{index} for the EC key.
// TLS staking certs and BLS keys are generated fresh (not deterministic from mnemonic).
// This is designed for runtime use - no files are written to disk.
func DeriveValidatorsFromMnemonic(mnemonic string, count int) ([]*ValidatorKey, error) {
if count <= 0 || count > 100 {
return nil, fmt.Errorf("invalid validator count: %d (must be 1-100)", count)
}
validators := make([]*ValidatorKey, count)
for i := 0; i < count; i++ {
vk, err := DeriveValidatorFromMnemonic(mnemonic, uint32(i))
if err != nil {
return nil, fmt.Errorf("failed to derive validator %d: %w", i, err)
}
validators[i] = vk
}
return validators, nil
}
// DeriveValidatorFromMnemonic derives a single validator key from mnemonic at given index.
// All keys (EC, TLS, BLS) are now derived deterministically from the mnemonic.
func DeriveValidatorFromMnemonic(mnemonic string, accountIndex uint32) (*ValidatorKey, error) {
vk := &ValidatorKey{}
// 1. Derive EC key from mnemonic using BIP44 path m/44'/60'/0'/0/{index}
ecKeyBytes, err := deriveMnemonicKey(mnemonic, accountIndex)
if err != nil {
return nil, fmt.Errorf("failed to derive EC key: %w", err)
}
vk.ECPrivateKey = ecKeyBytes
// Derive P-chain and C-chain addresses
luxPrivKey, err := luxcrypto.ToPrivateKey(ecKeyBytes)
if err != nil {
return nil, fmt.Errorf("failed to create secp256k1 key: %w", err)
}
pubKey := luxPrivKey.PublicKey()
vk.PChainAddr = ids.ShortID(pubKey.Address())
vk.CChainAddr = pubkeyToAddress(pubKey.ToECDSA())
// 2. Derive TLS staking cert deterministically from mnemonic
// Use a separate derivation path: m/44'/60'/1'/0/{index} for TLS keys
tlsKeyBytes, err := deriveMnemonicKeyForPath(mnemonic, 1, accountIndex) // account=1 for TLS
if err != nil {
return nil, fmt.Errorf("failed to derive TLS key seed: %w", err)
}
// Create P-256 private key from derived seed (TLS uses P-256, not secp256k1)
p256Key, err := deriveP256Key(tlsKeyBytes)
if err != nil {
return nil, fmt.Errorf("failed to derive P-256 key: %w", err)
}
certPEM, keyPEM, err := luxtls.NewCertAndKeyBytesFromKey(p256Key)
if err != nil {
return nil, fmt.Errorf("failed to generate TLS cert: %w", err)
}
vk.StakerCert = certPEM
vk.StakerKey = keyPEM
// Derive NodeID from TLS cert
tlsCert, err := luxtls.LoadTLSCertFromBytes(keyPEM, certPEM)
if err != nil {
return nil, fmt.Errorf("failed to parse TLS cert: %w", err)
}
stakingCert := &ids.Certificate{
Raw: tlsCert.Leaf.Raw,
PublicKey: tlsCert.Leaf.PublicKey,
}
vk.NodeID = ids.NodeIDFromCert(stakingCert)
// 3. Derive BLS signer key deterministically from mnemonic
// Use a separate derivation path: m/44'/60'/2'/0/{index} for BLS keys
blsSeed, err := deriveMnemonicKeyForPath(mnemonic, 2, accountIndex) // account=2 for BLS
if err != nil {
return nil, fmt.Errorf("failed to derive BLS key seed: %w", err)
}
// Create BLS signer from seed using proper BLS key derivation (handles field order internally)
blsKey, err := localsigner.FromSeed(blsSeed)
if err != nil {
return nil, fmt.Errorf("failed to create BLS key from seed: %w", err)
}
vk.BLSSecretKey = blsKey.ToBytes()
pop, err := signer.NewProofOfPossession(blsKey)
if err != nil {
return nil, fmt.Errorf("failed to generate BLS PoP: %w", err)
}
vk.BLSPublicKey = pop.PublicKey[:]
vk.BLSPoP = pop.ProofOfPossession[:]
return vk, nil
}
// deriveP256Key creates an ECDSA P-256 private key from a 32-byte seed.
// This allows deterministic TLS key generation from mnemonic-derived seeds.
func deriveP256Key(seed []byte) (*ecdsa.PrivateKey, error) {
if len(seed) < 32 {
return nil, fmt.Errorf("seed must be at least 32 bytes")
}
// Use the seed as the private key scalar (reduced mod curve order)
curve := elliptic.P256()
k := new(big.Int).SetBytes(seed[:32])
k.Mod(k, curve.Params().N)
// Ensure k is not zero
if k.Sign() == 0 {
k.SetInt64(1)
}
priv := &ecdsa.PrivateKey{
PublicKey: ecdsa.PublicKey{
Curve: curve,
},
D: k,
}
priv.PublicKey.X, priv.PublicKey.Y = curve.ScalarBaseMult(k.Bytes())
return priv, nil
}
// deriveMnemonicKeyForPath derives a key using BIP44 path m/44'/60'/{account}'/0/{index}
func deriveMnemonicKeyForPath(mnemonic string, account, index uint32) ([]byte, error) {
if !bip39.IsMnemonicValid(mnemonic) {
return nil, fmt.Errorf("invalid mnemonic phrase")
}
seed := bip39.NewSeed(mnemonic, "")
// Create master key from seed
masterKey, err := bip32.NewMasterKey(seed)
if err != nil {
return nil, fmt.Errorf("failed to create master key: %w", err)
}
// BIP-44 path: m/44'/60'/{account}'/0/{index}
// m/44' (purpose)
key, err := masterKey.NewChildKey(bip32.FirstHardenedChild + 44)
if err != nil {
return nil, fmt.Errorf("failed to derive purpose: %w", err)
}
// m/44'/60' (coin type for LUX)
key, err = key.NewChildKey(bip32.FirstHardenedChild + LUXCoinType)
if err != nil {
return nil, fmt.Errorf("failed to derive coin type: %w", err)
}
// m/44'/60'/{account}' (account - 0=EC, 1=TLS, 2=BLS)
key, err = key.NewChildKey(bip32.FirstHardenedChild + account)
if err != nil {
return nil, fmt.Errorf("failed to derive account: %w", err)
}
// m/44'/60'/{account}'/0 (change)
key, err = key.NewChildKey(0)
if err != nil {
return nil, fmt.Errorf("failed to derive change: %w", err)
}
// m/44'/60'/{account}'/0/{index} (address index)
key, err = key.NewChildKey(index)
if err != nil {
return nil, fmt.Errorf("failed to derive address index: %w", err)
}
return key.Key, nil
}
// LUXCoinType is the BIP-44 coin type for LUX (60' = standard Ethereum)
const LUXCoinType = 60
// deriveMnemonicKey derives an EC private key from mnemonic using BIP44 path m/44'/60'/0'/0/{index}
func deriveMnemonicKey(mnemonic string, accountIndex uint32) ([]byte, error) {
if !bip39.IsMnemonicValid(mnemonic) {
return nil, fmt.Errorf("invalid mnemonic phrase")
}
seed := bip39.NewSeed(mnemonic, "")
// Create master key from seed
masterKey, err := bip32.NewMasterKey(seed)
if err != nil {
return nil, fmt.Errorf("failed to create master key: %w", err)
}
// BIP-44 path: m/44'/60'/0'/0/{accountIndex}
// m/44' (purpose)
key, err := masterKey.NewChildKey(bip32.FirstHardenedChild + 44)
if err != nil {
return nil, fmt.Errorf("failed to derive purpose: %w", err)
}
// m/44'/60' (coin type for LUX)
key, err = key.NewChildKey(bip32.FirstHardenedChild + LUXCoinType)
if err != nil {
return nil, fmt.Errorf("failed to derive coin type: %w", err)
}
// m/44'/60'/0' (account)
key, err = key.NewChildKey(bip32.FirstHardenedChild + 0)
if err != nil {
return nil, fmt.Errorf("failed to derive account: %w", err)
}
// m/44'/60'/0'/0 (change)
key, err = key.NewChildKey(0)
if err != nil {
return nil, fmt.Errorf("failed to derive change: %w", err)
}
// m/44'/60'/0'/0/{accountIndex} (address index)
key, err = key.NewChildKey(accountIndex)
if err != nil {
return nil, fmt.Errorf("failed to derive address index: %w", err)
}
return key.Key, nil
}
+4
View File
@@ -0,0 +1,4 @@
{
"publicKey": "0xb57029264ce3e70b26ebd7c8796ee0a097f878973448716a6a61e3b0243f822aba62665f3a6dd318f688ca1baa9248c5",
"proofOfPossession": "0xa4ea78beabc3fdd9b2f6be1204f8c63a2ee0452ab7ea0977c102714f6a4d3a50c6bcb51e8fcb97fab51a4f4649c3367b10fde7b6960bfb7fc2785c6fb77a65dcd448ddf5533914930c919a296253c6dbb25d79443c96309c53dcc3477e553dde"
}
Binary file not shown.
+4
View File
@@ -0,0 +1,4 @@
{
"shortID": "9JTuXefKakdPgnHCkvS8Dx6BFMSLJstqU",
"ethAddress": "0x5b0e898ee782146c6a871959d4b795f598d01111"
}
+1
View File
@@ -0,0 +1 @@
7236854329f113eefaeb2ee835451f889eedbf4786b73dd6fa13ef5f6b9017cc
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIFCzCCAvOgAwIBAgIUf4jw7QyIXSSdcB6OFcMUYVaDjM8wDQYJKoZIhvcNAQEL
BQAwFTETMBEGA1UEAwwKbHV4ZC1ub2RlMTAeFw0yNTExMjgwNzAzNTFaFw0zNTEx
MjYwNzAzNTFaMBUxEzARBgNVBAMMCmx1eGQtbm9kZTEwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQC6XVi8QY5+YKLhGzcWQ4VdcX9apHYeZHXK1eocnPM7
ul1T94aNCnaKkCXnkaXckQoXHaq7FIVNGmO/47EZrCInlIPeols2dzPTC1Aeb/NW
Xucwrgz1CySyTs/KLewwtL3mzTAtcD+gwHJekL0Y4gngqBLERr+veQwx26RHEXGy
6364dkMBVxo1YLjxglTkluaMOTn8dj93WUAeZOGruYNqiEtysE1JMCzt+okICryP
jFSuabJlA6s+xeUCW+UY+nE3CnsVvycGOeRpeiqlfk7PrZ4RSCyRjwU5mQKQnB90
dvH71Q+P1OO48oW4YDewO0gTgQtFa9pvCTpxwMd7z1ApnvFZRQDGAmU6CekW9n5V
mDAnU6C/1/BJUjqcrsMHczR8OcLd7g3k8AAjWYQ2taPU8vTKVxeYuS2X/GIdx+sK
utVBRYemE2cwRBYKBTymvgDH872fig3b2pkCEl0CCF/sxt/DRrUD+M5YnXqhH29s
OGWsNIdk+BIYgIMjZ0Pd65ZdFR5KEI2BFCvkFXi51rSNjUkQY3yL5WDp1p7931FN
VzR+Z+gRR0SxrVcOe4Nr7DAHqRzwHNXcjndOt6xbZ3M37ybr9YOGMUHqkqgNc6R7
//QL43J91Ib8g7DhP3e98U7agGtevPZnkXJpqvgG5HZxOtwe+huDvEAVmwu6kUe9
QwIDAQABo1MwUTAdBgNVHQ4EFgQUtz6WTh3KhUniCncO6WQG/jQR/PgwHwYDVR0j
BBgwFoAUtz6WTh3KhUniCncO6WQG/jQR/PgwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAgEAAVGm3Lg+CFc+hlOriIvTvn2HHvh2ZszdUTS8AIg9PcXt
KbTOhc/BraF1wgPZk93Lhxu7i8MtW9akEL5PYxoJtan2U2qHIh8qWkz5Dc9Yd2dF
rsxfnZ8qN3nY2fJ3pwzV7qXyuCE57PgFEJ0npc8pGWCkumKJUx3Y0ojaM0yN2rO8
377lO4EQx96hfFA+ONDY9pERcgJCKpW+j8MgWfVlzYmeKT+xrHsBWAHWsDrOGdCP
RCzgI2/esZEoDkBcd/gc8zw5yB8RlBDYZigs41EyPhPDqygGpeimIyDYh8BhpwgE
bb52zmC9Nz6xhC/svtfp2MB7PsE3b21O5CY+7MfhyKkGtBF4dpgYwDPyvh/QMnQ+
IsMbRNpjUUioH66wEx4I3HC9ThBsBOq4PXsdwyRNXX2oSkK1vtSeL465ZXpRvvql
TL/uYKw+umy0/PzeMkX0ptCJ+d4Gb/CG2DozGf1G5aTfO/N4kumOAr2SeWAaRuxO
l9fnS3/ZgM/Jyxsvc7viiWSrzvzag21ge8BD7sjcK5lSUXMIeOJHi6VTozIER6yY
eDWvxv0TrXZ8HpfssRgjSpHK8DdsuXY9pjWXnqNYvWSNXzIctGkGyY3m8B22Lv1q
vVGI5NZEEKC9lGJjUW/L3r6tZWIhcl1RQkXFhizRocr5c8HnWTkcCmt7/IUGMww=
-----END CERTIFICATE-----
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
nyZ9gWVMobFQ+ahUL/S9+V5WjgiXYBo=
-----END PRIVATE KEY-----
+4
View File
@@ -0,0 +1,4 @@
{
"publicKey": "0xa8c919018cece3848005a5ccb70239bd9d7e4847ca3a5509e0038be4be3ef2bf4c448b838e1a6f64a72face134c0300d",
"proofOfPossession": "0xa665d53d4e5a56883799004ff6afb2d8f8b075bb51aad0568bb6e2dd27afb676bf93d0559481c69088205edafffafa090c470af7888e19c7ce29be2a9e5f261c8216c6d4e8bec3bf0a07f15b3731721c2f1a4e551b56eb729d33ba28ecbe7b93"
}
+1
View File
@@ -0,0 +1 @@
vf
+4
View File
@@ -0,0 +1,4 @@
{
"shortID": "9m1xuPkzW483uoqwoYjH2H3Y4ehAWmQhA",
"ethAddress": "0x60141cf8c087c8200f460d1eea3141039f8431f2"
}
+1
View File
@@ -0,0 +1 @@
24434a5d11e33bb2cfd9f15bde669bdbf6dc75d1475a842585a1bfdbb8bc31d3
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIFCzCCAvOgAwIBAgIUGOdxBB1TcqNegg4jzGARyOAcEaIwDQYJKoZIhvcNAQEL
BQAwFTETMBEGA1UEAwwKbHV4ZC1ub2RlMjAeFw0yNTExMjgwNzAzNTFaFw0zNTEx
MjYwNzAzNTFaMBUxEzARBgNVBAMMCmx1eGQtbm9kZTIwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCtEqoygvTDq0ud9T4VcGU7VTg0rBincIJbr+g6a6XR
R2s3Nc3RSV6crB/diK4zpLjaLT+h4SAZ1fae5TzfdUImClys8RIEepnrEueBzrw0
teg9Wj06ekAxlnzkQPPoCVtXFA9cl10c9kfdEZGrm/QByhNpVsirdPaimZsAOanJ
wz1sly461pjr1yl6omaczMaRVA+o/Jj7K8n2R4760usk4UcAejVOJVdBwLHE4UWk
ZK0iAZNVEb/HD03z/XIw7AZBFnBAauopD/z22wXagby+p5Ydx3tGhyDDgKZrIYyS
aaIjDLOFGuJRwGPc3BSyNmv1+kd95x2CSElRGCHeCAQvmbhxQLmdj0MOsH2yXqV9
7z3ieOzbGTkhuwN6//QNf0/YQxEZeJDMdCdZkMlMuwGiQ9HV0ZvGIkhVKZGW9JF5
y+47cHHHReZ2eznr21bIDWklWkGJizcOEy8uU6z4sRBtRxjKP72BGWX06A/6GwCM
2bo2UP+ctk1wLbymtHUR/lw/OhbcMlz7wEPz5F7xPUCy9/FhEMFIDGqSOpOrOLUd
lI4iRNB/fIx6Za6Vt/DtLkSy/zNESUnV/9q/NCqo9eLatBR/wM2yRxRXyKTvp8/t
+Z7pwRLaaCQGS08iPfaF42l8/6sYqEwjSJ04INTgaHlLoXgbzG/nIpqv7Ha9EQa/
IwIDAQABo1MwUTAdBgNVHQ4EFgQUzNbtEaDEVz1tOzosVjz3qSObFrUwHwYDVR0j
BBgwFoAUzNbtEaDEVz1tOzosVjz3qSObFrUwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAgEAWtmljUPOGoARl9XsbYpckg517li4mYd7+v5eIyN6NTIg
NRYVIEtsDvEggI5PFSYjOfc5DZSYT0tI7JIEjxp1W4VOPbdchWmc8O33lr7viFR4
ATU3JzXBGgxRyj491X/rTdEuQJy3szHm90MRM3FkQ9YfRzMzzyB+Ciu8p4rfR36x
T7b6GihgV1mbYK+mlM8X6m6iOJ1lV30ODzWsNvi3ICjxRqTq0IoXJBYSTtA887e5
7QvJuENryBaWlyM58tkhYsyFOTO18Pxqfivfd7UFwTyicOJVLUjOhzPX3hXKVDcr
jVVoD1OlVwm26510CVZSj8HNbh9knS2CBKvwdEPmv+tZgTVjDLc0CdaEJK6a5T1O
/YetsymTgSr55ouNxTjy+iPd49CTfqiVNhx2Wkf2pZ9W6e2zwOM0wRp1vdomhN77
g4tbist7ntqq5j37MDEahsFg8KpbLyZRKwD2NlxxTcFyGAi2QpacVljcciTWuvHf
qmjYaitaVHDDxz2tsiaVgJGHpqfDwIXBr3DeEGMbmqsv2d2oSVNELeBtQQj+cbIU
d7tbCMyTr+KP7P5ykhuDqJIQSIDXD4d3EkfsfwZHOSGhtwrTxLj59+519dsYasOw
bpbNv4vWe0RNmOYEThkdAK3CAufn3IiZdX5x6Da/SdlwIbpkuAvEMa1Hp1kIuO4=
-----END CERTIFICATE-----
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
shQvDtSVsjN+gRiCxB5FfNKBrZX4KQ==
-----END PRIVATE KEY-----
+4
View File
@@ -0,0 +1,4 @@
{
"publicKey": "0x8311f8eb155c17c3331fe16b1ead106d79674ed56979df1188fad111af4bc632d1d9bccf8dcc63a314d8b3cd6e015c8a",
"proofOfPossession": "0x80eed5ca57a1ed4a07f65e9661cce582fcab20e3703f8db4f6d322ee871c6d13ca736d564c72170f55f3cc5b1f992f4310888a5c65fba9bd6a72ddb36917794a1fe4762f71776acc514000224cf418ef5ffcd00fb67c3e72a6228db606334e08"
}
+1
View File
@@ -0,0 +1 @@
—yáZþ啈_u9÷,y¼ÚûQpüõfúûñYÑ7
+4
View File
@@ -0,0 +1,4 @@
{
"shortID": "NNwuwoJyg8Hv1EgG7zEUVW6UrXvSfKR89",
"ethAddress": "0xea813730ce492f9bf64c47ff761ef093b51a70e0"
}
+1
View File
@@ -0,0 +1 @@
55726f076817eba7f7d838728ed105c57af7ba0cd47e54398715b8bfdcbe33c9
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIFCzCCAvOgAwIBAgIULKxJPuOFFwlRrc/yRhzcy6APoxgwDQYJKoZIhvcNAQEL
BQAwFTETMBEGA1UEAwwKbHV4ZC1ub2RlMzAeFw0yNTExMjgwNzAzNTFaFw0zNTEx
MjYwNzAzNTFaMBUxEzARBgNVBAMMCmx1eGQtbm9kZTMwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCmocdiehawg5LEqKtdNilACTKsKa/ARRdPBfWhCHMh
vFtpSGHgHSuoCwbIJLNuX3QSbxn3+XbBfjqYEVfr0TC2hfm0swbQ+GcEb/ueomB1
dE5HcLg1RWp+4uNiiRxHVRgS0vACtTGp/hI0YNUBHplmn+zf0vCFR58aknrpnC52
QKLwldNl0XZ4iKTLUHAUaQ3vPQWF5biSoi7ayY2sQhH0tUf8r08akwL67ROLPwA/
/E30uN83RqM1XBnUNBjkjZKnkLKun+3Qhrn9J/NSs4Jl+y/vOAgyEHhF3G53SMyo
n25sGciDEtJ2hMcQzgT+F4k+6uuaCzRYDGvVaITeU2sVJQ8HKMZSxaJYruFgDvQ3
EsY3yZbbZKubztOm4ggawCoXDVDGyADLfiCzmgqpW2gj6JS8VehhHDD37epQGPKV
3ThwCbaIh8xa1OjK1xxXRUKaCxNzzHJk/LBKvdgdsV+TCkhVVn2mD1jy/0uVkkSn
3VONCZ2Mj7XBHwWb7MydVS4OCvxBQ85AKZ/wl61IAOiOORAMU0mf/bimDUPsCX5I
39og9xQxt9DmMvvBwoJ2V/QsowqGmXx6/7rEBGNfpZIgeSrUgPq0MQz6gLLV7LAw
UnQ/kwud4Ri1Efwm3deIKInh9FGeerpvbjjoVKxN2K8hV8Qb5mmeytCQq5tIywYb
JwIDAQABo1MwUTAdBgNVHQ4EFgQUrWlrMxWg+rQ8XeRSJ+eRSZf63ZkwHwYDVR0j
BBgwFoAUrWlrMxWg+rQ8XeRSJ+eRSZf63ZkwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAgEAKKj8H9f+Bn/ddejeMSVXR2TyBy9ik/q1FYbdUZrzkNrY
zM7rP4GfdvsUilFvlHHw2Awhm9SKkwR5oTVs1ucczN81Fz1OrIxaudjVp8u4TRZf
KfizRmqo2wlq/2NaMOJTLeBgNsIqr5U1kqEU/Ejo6Wop/Qs53L4oWWYrmnr5ohs1
6BUc9JTC/11rOwBnYo1610/VmA9FJ4mD+hYMjdcYT3Uk3uytl9KqXUvUYgQjC4m7
gooSfYfuvLP/7ApTjMP1tqk1jNmHVaAC4RhW0FP46p9kzbHAC+a1fCzKmN/gaF1v
xQptbYOwfb5MucNo3ENPmyQ3+e++9yCNot+a+re4JHOUNglywd+8m3DiUGEU9aBE
1ti05j0H9RtTwHKsCocCa3cwLZSehKCZJvGbubzcSnE7VY1MiyOhS9TCQhHxZFoy
1ocH9Pucdj3ZODG0hEiY+zlB5HyQLIdUlBIZD9wsO4PiqgP6a8dZnXPlTvPjirza
vzPW/JQ7eyzjxdpsmPy8fLoY9Cr1z8cQHld8EDZAOMzgBgn6DswajcSK24RK1EHa
frhX0WVwXu06ifzf9p65d8pxLq+Z04kTI9sLQiNMQCLvC5yCW4vqAtBhoPEy75FE
FKOSrvzSocvSFo68+30e0Oh1Q0frptXYUfDWiFGn64oEZLv5Fj46TQE5WWLzmC8=
-----END CERTIFICATE-----
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
R8cuizP3jeF0/RMJgg3Aryxa5SSuvTQ9
-----END PRIVATE KEY-----
+4
View File
@@ -0,0 +1,4 @@
{
"publicKey": "0xa1efbd891644e1ec9c4f4e423e9a336dfafe551634dd222426734881b80bd80bebf34d06e95da5cf6222735e172ee21a",
"proofOfPossession": "0x8db0c22bf8ffc19964eb1d8c952fd0aa7cc12ee44941e3bbcd126bf54b9f90e4becd826819e68d6bb6eb368ce278531618b95e04c09c1eb7cb4a727c5a380c752894621ea3d80888fa11d8eca26e785d97978814e931f6141cf7f1069cda28c0"
}
Binary file not shown.
+4
View File
@@ -0,0 +1,4 @@
{
"shortID": "EYrba79gcqhJUqjJjt7aBQnRQCmo4v5zD",
"ethAddress": "0x949fee426604137cd94dcf283d01095d533a8a51"
}
+1
View File
@@ -0,0 +1 @@
100b76c3b981a3fceac7d3fc390c55e879431a95da35e3e4577f0e2d3240ef0f
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIFCzCCAvOgAwIBAgIULSD9AwR7XQZmsJ2XIh3sXgRiOrwwDQYJKoZIhvcNAQEL
BQAwFTETMBEGA1UEAwwKbHV4ZC1ub2RlNDAeFw0yNTExMjgwNzAzNTJaFw0zNTEx
MjYwNzAzNTJaMBUxEzARBgNVBAMMCmx1eGQtbm9kZTQwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCZaM+DfL0SAYz9ipRxKzprrdSEpztq/Sb15OYeO2st
zfxbi8kj1lIOlVV43GRtcjyhiX1aNSVSHHGFLc6rIplKacmCEP0wLDV3G0pPPRq9
jtgIH+zbu+GwFbuWPhlMMhJVrsgfRXCfAabfy4Z2J9cMh6cO5XvgmTemR94ik8bk
tqBOqNFUC79YdP07dOspRjkh2pCEsaNG8u1f8WNGCUffBtEmbPWytIWE2DQD8zEu
hJFCOR3KWwMt9fbR35OW0wiTaCIHE7xX0zMKc+vx/t/vwOWkRZQse7HFjXMwbzv6
mt4AXcSkXvbcnGLPi8r8KweVbYFmyXKMCWPxxmg0OaOD9q2e9Bq0LyVHelfCIQZe
XJmBaQx50YnH1Unlk2V4YuE5OlSX9bqGlx3Ao1lQZwuV1TSubm3JVaR6Dly87CFT
Kdxdz/6np24bySBbGDj4dHS+ys+C9StGqP6sCubcDMKhKzC8S1nQT41WZbR+c90n
cLecTH4vrxHeu5cRUzEFgvN56rpsj0X9C4hZQ2Wtq3/rIkgmS29rJMNrlZZXzkJl
/MFiBEyRI+1nzCRvI8tU5szunkCoobdVqapjz/bNAmuO0Zdq+mms/84M0PS3b3Wp
BJpzOEX4kkOgGHR1D0gdvIUDJ22J9SsB6Rmty8Q9cMc8GsJoKicfjv931UKMsMEM
KQIDAQABo1MwUTAdBgNVHQ4EFgQUHCjNScU1x2LwWsIO6Do8bApT8ogwHwYDVR0j
BBgwFoAUHCjNScU1x2LwWsIO6Do8bApT8ogwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAgEAPKC9idjXFsyW4GJ5FGwW+gR/aAevDYcDOZ4nBWSbDl7n
UZQDWgvZRZmaR7P5gKuAcpbaEF+/rnljShB/9wPliBGdO4EVZw07CH+Km0WfKIKi
k6H5VZeOmS8zsueEi+yWGzGAf46Al/KK1T6QSMuO2ZX8NXTskmI6Cl+ZU627aXdy
Bb0N2Y6R96fnMb1T44bs8Ck+6XE+KNlHmwzZyzl09X2+6aqFUWPKgAWmWyzCdIN+
PS3wALJZrtOGM01qYDBjmEvfUyQkU01N73iPEUKDf8AOST4HbEb6WxNK7j+aGIRx
IZJZLgzBf7XPqUvbW8cXKcPI5zbUUEegKKg4scs5Ffp6af9OXejLLntUxeTgtole
eASXVKBckijBrwx/qMCjQjpkdxe10SEgN5nMr17+IGHV1obICJylGCi1AMVDxY1+
cPtBCEvGI10G5ad109qBY+5PskWJ7pfJm+wChHnTT5ykPDMu1uhQgII+kwMoIwIj
9mrCU7doS2HbKtWjnvavxlAYnHef6N7IjQ7HlYxNUv6Hra9/cSCF9xxObt7lH2TB
U5lPncQ1eF5XaM3/tXeZLSCwYQyOpnWCwSk5cwTTMhxm2OYPKOIsiLdZ9J5L4/3A
yo+4IhnB/zQp+FoBiOuRBfiiv+D6TsvR0/F/h9BDO/sSRhed8LBThdnt7EII59o=
-----END CERTIFICATE-----
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
/+GpDChvhpRV5owqBcU/nI+ciOXEUA==
-----END PRIVATE KEY-----
+4
View File
@@ -0,0 +1,4 @@
{
"publicKey": "0xa07f54a097a707887321389d1234fad5deb7a694af48224edb4206883a1569b6b3e66338fea993ce691db5a0a9690766",
"proofOfPossession": "0xa8430081d55f578c8060b8042b6b3e41d2583c87c1896b72d908b68efb96027ab86fa6ba3ef7f6e22aa4a56abb4eaa69053e7adbab4a292152b94921070e0621ff8948b92bc2aa7641381b20d340be355e42086946e78c2b175441e1e6c43b9a"
}
+1
View File
@@ -0,0 +1 @@
$Ң}yl;[XK~H
+4
View File
@@ -0,0 +1,4 @@
{
"shortID": "EdQYZENPKXBwFfEBoCE9MithGD2Suawdw",
"ethAddress": "0x957c436eb8519f18a2c71191c9534fa8ba53f35f"
}
+1
View File
@@ -0,0 +1 @@
2cb05f96b54a1df2ff17342af9adcbb3aca437b46c0509f132e3ab4982cedbbf
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIFCzCCAvOgAwIBAgIUC6uk+uc/QWfe52SWSx0+FVSZkkswDQYJKoZIhvcNAQEL
BQAwFTETMBEGA1UEAwwKbHV4ZC1ub2RlNTAeFw0yNTExMjgwNzAzNTJaFw0zNTEx
MjYwNzAzNTJaMBUxEzARBgNVBAMMCmx1eGQtbm9kZTUwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQC7t+g6qnSMKeL8Y011X9VoR/hoUyaC3IxsSh9yrRL0
JZMXiOlSnavhwvrHh+qrb1+LS+QoNYhaxKbS356lVRHJC6eQj5Cv9cdOgePklI2s
JOUStOii5ZBbJBEIsPdOS8SJCGHYyjv985D2PCm71hSIL3+wy3SGf3ZlZeUFpDAi
6BHwOSZ+a3jNiqTKv3D9VVmnIVa3h7w4UuPZPzQmjBWsCiRo/LcFEnAJa1M349Nb
K7biLsb/MOTA2M3XGOC6QGEO2yY/0EO5nk0Dm2Hfsj8IrA4lVNQuDANWNVHBQQud
UkSNLX0tleSKX+ui7LzxbCxa3yGpVxxoM6A+OXX11HS8fiy9EuKWYT3wE7Rvvayj
+uDHLKCMxh9w1TNgnfkISreTo1HLv0ttf1vlHYZ8P6oPbSG4Pb0HwX3k6V81KiGt
ntIuXpJ3xS9ieDOR8whbeK+dvRPkYtvhmUrmiFW90RDFSmECVMzbHIz6rbz18eJl
/Y1NE5W64PkgrgL2WvIyob5bP5vDDOSmBPd3NobqO4WqAGXIo7+6PK5Jdaj+taj5
PQ0bPhG6McYQCTdZcdUpjE+DoNAfQRaQAMAM+EFRCA06uKqc8zrMGfXEezBcVsTK
eBKwVVpheNQ56Pj/X4CHM0H6gkgj+MENpdNPaam/EyTkjE3DIQmyIPJ9iTUn9YhT
ewIDAQABo1MwUTAdBgNVHQ4EFgQUmArK+xMq1YPD/B6x4lnkeJFQNl0wHwYDVR0j
BBgwFoAUmArK+xMq1YPD/B6x4lnkeJFQNl0wDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAgEAPmw7kc1rYIsfcYUm0GjuCbn+0ctXwj3xT6TtIuCUETLH
CNVsrjWYOjEiu1518JSHJFLQeTYD7Xcqrwg9LoCNC1LkFTpp7IcXwH9nZcFRtEVK
JEy3HfNxh6PlZuHQI6/PjHuEG4eHDuaoY5l+J9QQk6NzILvnjhev/M2Sxhp7vJGX
B7v9wC3QLC8HWDrx0eIVtJfRuxRbrEd9EaibKGXzRmwdPbO7dl3YZkRtOM6xzwAi
AcwrB/C0e0vEMBsG7y58Dmn9Cla5eHT/Os97TvcHIDgrja0tLW71BBhJc/pY3VYC
wmvksQH2jvjF4oq1sR3LHHvIvXE7Hyhmao3eKo8deQtIKSJqOAlu+jQXJNCWz9ye
jNwYffUInVOuI8/16l1jFX29dXNGtOSuaVDZTDgo6QKkQAPQ1UkpbFLUEnVbxWNP
zZAQFCBEgByD8QHaq75IbQnXAf3bBemSXPgtxoSKt8moUNUiZX9ET4qRYkYlX6jA
HCMtUyysL5up9gyECWm/l93p8ECzDs0Q2LRBj7DoRM3X44o3Jdg+gwhpqPty4ahT
RulyKsk/EGCFqGPTJb6zx0DaMEihY5bqv50T0zsSxcPIkCcZWDimyvyZpzPAUNvD
tdLcLEs0ei2ASuD7hXKq/FR2kE7HGLgLUct344NaFtHdqj2xmm4nkU9aG9oel6M=
-----END CERTIFICATE-----
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
Y/RS4VZytAQWugF+BCQjH7wS0RqK
-----END PRIVATE KEY-----
+3 -3
View File
@@ -16,8 +16,8 @@ import (
"github.com/luxfi/crypto/bls/signer/localsigner" "github.com/luxfi/crypto/bls/signer/localsigner"
luxcrypto "github.com/luxfi/crypto/secp256k1" luxcrypto "github.com/luxfi/crypto/secp256k1"
"github.com/luxfi/ids" "github.com/luxfi/ids"
"github.com/luxfi/protocol/p/signer" "github.com/luxfi/node/staking"
luxtls "github.com/luxfi/tls" "github.com/luxfi/node/vms/platformvm/signer"
) )
func main() { func main() {
@@ -75,7 +75,7 @@ func upgradeNode(nodeDir string) error {
return fmt.Errorf("failed to read staker.key: %w", err) return fmt.Errorf("failed to read staker.key: %w", err)
} }
tlsCert, err := luxtls.LoadTLSCertFromBytes(keyPEM, certPEM) tlsCert, err := staking.LoadTLSCertFromBytes(keyPEM, certPEM)
if err != nil { if err != nil {
return fmt.Errorf("failed to load TLS cert: %w", err) return fmt.Errorf("failed to load TLS cert: %w", err)
} }