Skip to content

Commit 287bfd6

Browse files
Merge pull request #28 from rarimo/fix/vault-new
Parse secrets map from vault
2 parents 5874271 + 08ccb14 commit 287bfd6

File tree

7 files changed

+292
-110
lines changed

7 files changed

+292
-110
lines changed

config.yaml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
vault:
2+
disabled: false
3+
addr: "http://127.0.0.1:8200"
4+
mount_path: "secret_data"
5+
secrets:
6+
relayer: "relayer"
7+
18
network:
29
rpc: "https://rpc.evm.mainnet.rarimo.com/"
3-
vault_address: "http://127.0.0.1:8200"
4-
vault_mount_path: "secret_data"
510
gas_multiplier: 1.23
611
private_key: without '0x' # For security purposes this key may be omitted and flow with Vault would be used
712

@@ -33,8 +38,6 @@ pinger:
3338
voting_v2:
3439
rpc: ""
3540
private_key: ""
36-
vault_address: "https://127.0.0.1:8200"
37-
vault_mount_path: "secret_data"
3841
proposal_state_address: ""
3942
block: 0
4043
gas_limit: 800000

internal/config/main.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package config
22

33
import (
4+
"github.com/rarimo/proof-verification-relayer/internal/pkg/vault"
45
"gitlab.com/distributed_lab/kit/comfig"
56
"gitlab.com/distributed_lab/kit/copus"
67
"gitlab.com/distributed_lab/kit/copus/types"
@@ -16,6 +17,7 @@ type Config interface {
1617
NetworkConfiger
1718
ContractsConfiger
1819
VotingV2Configer
20+
vault.Vaulter
1921
Pinger() Pinger
2022
Replicator() Replicator
2123
Ipfs() Ipfs
@@ -30,21 +32,32 @@ type config struct {
3032
NetworkConfiger
3133
ContractsConfiger
3234
VotingV2Configer
35+
vault.Vaulter
3336

3437
pinger comfig.Once
3538
replicator comfig.Once
3639
ipfs comfig.Once
3740
}
3841

3942
func New(getter kv.Getter) Config {
43+
vaulter := vault.NewVaulter(getter)
44+
v := vaulter.Vault()
45+
46+
networkConfiger := NewNetworkConfiger(getter)
47+
votingV2Configer := NewVotingV2Configer(getter)
48+
49+
networkConfiger.(*ethereum).SetVault(v)
50+
votingV2Configer.(*ethereumVoting).SetVault(v)
51+
4052
return &config{
4153
getter: getter,
4254
Databaser: pgdb.NewDatabaser(getter),
4355
Copuser: copus.NewCopuser(getter),
4456
Listenerer: comfig.NewListenerer(getter),
4557
Logger: comfig.NewLogger(getter, comfig.LoggerOpts{}),
46-
NetworkConfiger: NewNetworkConfiger(getter),
4758
ContractsConfiger: NewContractsConfiger(getter),
48-
VotingV2Configer: NewVotingV2Configer(getter),
59+
NetworkConfiger: networkConfiger,
60+
VotingV2Configer: votingV2Configer,
61+
Vaulter: vaulter,
4962
}
5063
}

internal/config/network.go

Lines changed: 18 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,17 @@ import (
88

99
"github.com/ethereum/go-ethereum/crypto"
1010
"github.com/ethereum/go-ethereum/ethclient"
11-
vaultapi "github.com/hashicorp/vault/api"
12-
"gitlab.com/distributed_lab/dig"
11+
"github.com/rarimo/proof-verification-relayer/internal/pkg/vault"
1312
"gitlab.com/distributed_lab/figure/v3"
1413
"gitlab.com/distributed_lab/kit/comfig"
1514
"gitlab.com/distributed_lab/kit/kv"
1615
"gitlab.com/distributed_lab/logan/v3/errors"
1716
)
1817

18+
const (
19+
relayerSecretName = "relayer"
20+
)
21+
1922
type NetworkConfiger interface {
2023
NetworkConfig() *NetworkConfig
2124
}
@@ -29,16 +32,18 @@ func NewNetworkConfiger(getter kv.Getter) NetworkConfiger {
2932
type ethereum struct {
3033
once comfig.Once
3134
getter kv.Getter
35+
vault vault.Vault
36+
}
37+
38+
func (e *ethereum) SetVault(v vault.Vault) {
39+
e.vault = v
3240
}
3341

3442
type NetworkConfig struct {
3543
Client *ethclient.Client `fig:"rpc,required"`
36-
Address string `fig:"vault_address,required"`
37-
MountPath string `fig:"vault_mount_path,required"`
3844
GasMultiplier float64 `fig:"gas_multiplier,required"`
3945

4046
ChainID *big.Int `fig:"chain_id"`
41-
Token string `dig:"VAULT_TOKEN,clear"`
4247
PrivateKey *ecdsa.PrivateKey `fig:"private_key"`
4348
nonce uint64
4449

@@ -65,11 +70,16 @@ func (e *ethereum) NetworkConfig() *NetworkConfig {
6570

6671
result.ChainID = chainID
6772

68-
if result.PrivateKey == nil {
69-
result.PrivateKey, err = retrieveVaultPrivateKey(result)
73+
if result.PrivateKey == nil && e.vault != nil {
74+
var relayerSecret struct {
75+
PrivateKey *ecdsa.PrivateKey `fig:"private_key,required"`
76+
}
77+
78+
err := e.vault.FigureOutSecret(relayerSecretName, &relayerSecret, false)
7079
if err != nil {
71-
panic(errors.Wrap(err, "failed to retrieve vault private key"))
80+
panic(errors.Wrap(err, "failed to figure out relayer secret"))
7281
}
82+
result.PrivateKey = relayerSecret.PrivateKey
7383
}
7484

7585
nonce, err := result.Client.NonceAt(context.Background(), crypto.PubkeyToAddress(result.PrivateKey.PublicKey), nil)
@@ -85,46 +95,6 @@ func (e *ethereum) NetworkConfig() *NetworkConfig {
8595
}).(*NetworkConfig)
8696
}
8797

88-
func retrieveVaultPrivateKey(result NetworkConfig) (*ecdsa.PrivateKey, error) {
89-
vaultCfg := struct {
90-
Token string `dig:"VAULT_TOKEN,clear"`
91-
}{}
92-
93-
if err := dig.Out(&vaultCfg).Now(); err != nil {
94-
panic(err)
95-
}
96-
result.Token = vaultCfg.Token
97-
98-
conf := vaultapi.DefaultConfig()
99-
conf.Address = result.Address
100-
101-
vaultClient, err := vaultapi.NewClient(conf)
102-
if err != nil {
103-
panic(errors.Wrap(err, "failed to initialize new client"))
104-
}
105-
106-
vaultClient.SetToken(result.Token)
107-
108-
secret, err := vaultClient.KVv2(result.MountPath).Get(context.Background(), "relayer")
109-
if err != nil {
110-
panic(errors.Wrap(err, "failed to get secret"))
111-
}
112-
113-
vaultRelayerConf := struct {
114-
PrivateKey *ecdsa.PrivateKey `fig:"private_key,required"`
115-
}{}
116-
117-
if err := figure.
118-
Out(&vaultRelayerConf).
119-
With(figure.BaseHooks, figure.EthereumHooks).
120-
From(secret.Data).
121-
Please(); err != nil {
122-
panic(errors.Wrap(err, "failed to figure out"))
123-
}
124-
125-
return vaultRelayerConf.PrivateKey, nil
126-
}
127-
12898
func (n *NetworkConfig) LockNonce() {
12999
n.mut.Lock()
130100
}

internal/config/voting_v2_config.go

Lines changed: 26 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ import (
88

99
"github.com/ethereum/go-ethereum/common"
1010
"github.com/ethereum/go-ethereum/crypto"
11-
1211
"github.com/ethereum/go-ethereum/ethclient"
13-
vaultapi "github.com/hashicorp/vault/api"
14-
"gitlab.com/distributed_lab/dig"
12+
"github.com/rarimo/proof-verification-relayer/internal/pkg/vault"
1513
"gitlab.com/distributed_lab/figure/v3"
1614
"gitlab.com/distributed_lab/kit/comfig"
1715
"gitlab.com/distributed_lab/kit/kv"
@@ -31,6 +29,11 @@ func NewVotingV2Configer(getter kv.Getter) VotingV2Configer {
3129
type ethereumVoting struct {
3230
once comfig.Once
3331
getter kv.Getter
32+
vault vault.Vault
33+
}
34+
35+
func (e *ethereumVoting) SetVault(v vault.Vault) {
36+
e.vault = v
3437
}
3538

3639
type VotingV2Config struct {
@@ -68,15 +71,13 @@ func (e *ethereumVoting) VotingV2Config() *VotingV2Config {
6871
var result VotingV2Config
6972

7073
networkConfig := struct {
71-
RPC *ethclient.Client `fig:"rpc,required"`
72-
PrivateKey *ecdsa.PrivateKey `fig:"private_key"`
73-
VaultAddress string `fig:"vault_address"`
74-
VaultMountPath string `fig:"vault_mount_path"`
75-
Address common.Address `fig:"proposal_state_address,required"`
76-
Block uint64 `fig:"block"`
77-
GasLimit uint64 `fig:"gas_limit"`
78-
Enable bool `fig:"enable"`
79-
WithSub bool `fig:"check_with_subscribe"`
74+
RPC *ethclient.Client `fig:"rpc,required"`
75+
PrivateKey *ecdsa.PrivateKey `fig:"private_key"`
76+
Address common.Address `fig:"proposal_state_address,required"`
77+
Block uint64 `fig:"block"`
78+
GasLimit uint64 `fig:"gas_limit"`
79+
Enable bool `fig:"enable"`
80+
WithSub bool `fig:"check_with_subscribe"`
8081
}{}
8182
err := figure.
8283
Out(&networkConfig).
@@ -96,14 +97,23 @@ func (e *ethereumVoting) VotingV2Config() *VotingV2Config {
9697
}
9798

9899
result.PrivateKey = networkConfig.PrivateKey
99-
if result.PrivateKey == nil {
100-
result.PrivateKey = extractPrivateKey(networkConfig.VaultAddress, networkConfig.VaultMountPath)
101-
}
100+
if result.PrivateKey == nil && e.vault != nil {
101+
var relayerSecret struct {
102+
PrivateKey *ecdsa.PrivateKey `fig:"private_key,required"`
103+
}
104+
105+
err := e.vault.FigureOutSecret(relayerSecretName, &relayerSecret, false)
106+
if err != nil {
107+
panic(errors.Wrap(err, "failed to figure out relayer secret"))
108+
}
102109

103-
result.nonce, err = result.RPC.NonceAt(context.Background(), crypto.PubkeyToAddress(result.PrivateKey.PublicKey), nil)
110+
result.PrivateKey = relayerSecret.PrivateKey
111+
}
112+
nonce, err := result.RPC.NonceAt(context.Background(), crypto.PubkeyToAddress(result.PrivateKey.PublicKey), nil)
104113
if err != nil {
105114
panic(errors.Wrap(err, "failed to get nonce"))
106115
}
116+
result.nonce = nonce
107117
result.Address = networkConfig.Address
108118
result.mut = &sync.Mutex{}
109119
result.Block = networkConfig.Block
@@ -137,43 +147,3 @@ func (n *VotingV2Config) ResetNonce(client *ethclient.Client) error {
137147
n.nonce = nonce
138148
return nil
139149
}
140-
141-
func extractPrivateKey(vaultAddress, vaultMountPath string) *ecdsa.PrivateKey {
142-
conf := vaultapi.DefaultConfig()
143-
conf.Address = vaultAddress
144-
145-
vaultClient, err := vaultapi.NewClient(conf)
146-
if err != nil {
147-
panic(errors.Wrap(err, "failed to initialize new client"))
148-
}
149-
150-
token := struct {
151-
Token string `dig:"VAULT_TOKEN,clear"`
152-
}{}
153-
154-
err = dig.Out(&token).Now()
155-
if err != nil {
156-
panic(errors.Wrap(err, "failed to dig out token"))
157-
}
158-
159-
vaultClient.SetToken(token.Token)
160-
161-
secret, err := vaultClient.KVv2(vaultMountPath).Get(context.Background(), "relayer")
162-
if err != nil {
163-
panic(errors.Wrap(err, "failed to get secret"))
164-
}
165-
166-
vaultRelayerConf := struct {
167-
PrivateKey *ecdsa.PrivateKey `fig:"private_key,required"`
168-
}{}
169-
170-
if err := figure.
171-
Out(&vaultRelayerConf).
172-
With(figure.EthereumHooks).
173-
From(secret.Data).
174-
Please(); err != nil {
175-
panic(errors.Wrap(err, "failed to figure out"))
176-
}
177-
178-
return vaultRelayerConf.PrivateKey
179-
}

0 commit comments

Comments
 (0)