Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
358b9e0
Lodestar prover for execution api (#5222)
nazarhussain Mar 26, 2023
b861ab8
Revert "Pull gossip queues for better throughput (#5195)" (#5305)
twoeths Mar 27, 2023
f136f95
Log index if attestations are published per committee (#5307)
nflaig Mar 28, 2023
f3df9f8
Use finalized state id when no checkpoint provided in checkpoint sync…
g11tech Mar 29, 2023
2b03d90
Limit preaggregating attestations (#5256)
twoeths Mar 29, 2023
3f3f634
Update release.md with RC patching clarity (#5312)
philknows Mar 29, 2023
d360e62
Only preaggregate attestations if there are connected aggregators (#5…
twoeths Mar 29, 2023
1bbcd95
Make the prover package private to avoid publishing (#5318)
nazarhussain Mar 29, 2023
7e34b46
[Snyk] Security upgrade grafana/grafana from 8.5.20 to 8.5.22 (#5321)
snyk-bot Mar 30, 2023
a2f749a
Unschedule capella in chiado and gnosis (#5324)
g11tech Mar 30, 2023
8eb8dce
Enable metrics if monitoring endpoint is configured (#5328)
nflaig Mar 31, 2023
3ddd326
Reference gh issue with rationale for choosing vc http timeout (#5329)
nflaig Mar 31, 2023
4f2d811
Handle timeout errors as api errors (#5331)
nflaig Apr 3, 2023
9bf2ce1
Add support for the dial only protocols (#5325)
nazarhussain Apr 3, 2023
c87a36c
Missing state-transition dependency in light-client package (#5332)
Savid Apr 3, 2023
887064d
Add logging support to prover (#5250)
nazarhussain Apr 3, 2023
1e0eba3
Upgrade Typescript 5.x (#5340)
nazarhussain Apr 5, 2023
9d459af
Add support for eth_getTransactionCount to prover (#5338)
nazarhussain Apr 5, 2023
b56770b
Add support for eth_getBlockByHash and eth_getBlockByNumber (#5339)
nazarhussain Apr 5, 2023
ddc58ce
Add logging policy (#5299)
dapplion Apr 6, 2023
7979491
Add note about setting default nodejs version when using nvm (#5348)
nflaig Apr 6, 2023
83b29d7
Update outdated dependencies (#5345)
nazarhussain Apr 6, 2023
4e5f2fd
Revert "Revert "Pull gossip queues for better throughput (#5195)" (#5…
twoeths Apr 7, 2023
904d86a
Process gossip block immediately (#5263)
twoeths Mar 28, 2023
db1b585
Handle gossip messages asynchronously (#5316)
twoeths Mar 31, 2023
a905d74
Cache gossip validation by attestation data (#5333)
twoeths Apr 4, 2023
eec00db
Handle unknown block root attestations (#5327)
twoeths Apr 7, 2023
2d2d0c0
Fix lint
twoeths Apr 7, 2023
c65e1a4
Fix network processor jobsSubmitted metric (#5354)
twoeths Apr 11, 2023
b5e8b8b
Implement distributed aggregation selections (#5344)
nflaig Apr 14, 2023
9eb2ca3
Update release.md hotfix releases section (#5335)
philknows Apr 14, 2023
fb90b02
Bump monorepo version to 1.7.2 (#5365)
wemeetagain Apr 15, 2023
42ecf97
Allow release from `stable` in release process (#5367)
wemeetagain Apr 15, 2023
850f9f6
Add User-Agent to builder requests (#5361)
dapplion Apr 17, 2023
395a246
Gossip queue to drop by ratio (#5355)
twoeths Apr 17, 2023
fd00c1f
Skip deserializing gossip attestation messages by caching Attestation…
twoeths Apr 17, 2023
307912d
Update yargs to v17 (#5159)
wemeetagain Apr 17, 2023
8a6bc9d
Upgrade fastify to latest version (#5369)
nazarhussain Apr 17, 2023
6cfc518
Upgrade lerna to lerna 6 (#5368)
nazarhussain Apr 17, 2023
3ee1d8a
Remove outdated logging framework in style guide (#5370)
nflaig Apr 17, 2023
0488388
Fix the formatting of blockValue in the validator proposer logs (#5385)
g11tech Apr 19, 2023
c4ba9ff
Add eth_getCode support to prover (#5364)
nazarhussain Apr 19, 2023
35fe214
Add option to override preset with custom values from file (#5387)
nflaig Apr 19, 2023
7af22d7
Add TOO_MANY_SKIPPED_SLOTS attestation error (#5390)
twoeths Apr 20, 2023
12c3ea7
Ignore attestation messages if cannot regen head states (#5375)
twoeths Apr 20, 2023
ddbae50
Correctly override active preset (#5389)
nflaig Apr 20, 2023
ffc0d16
Decrypt keystores in a thread pool (#5357)
wemeetagain Apr 20, 2023
fb192bf
Add execution blockNumber to the notifier log (#5297)
g11tech Apr 20, 2023
10d2839
Update fastify.listen() method invocations (#5395)
nflaig Apr 21, 2023
a65f035
Update JSON schema for multiple types to use anyOf (#5396)
nflaig Apr 21, 2023
7469f0d
Use fastify `req.routeConfig` instead of `res.context.config` (#5398)
nflaig Apr 21, 2023
e746f9c
DOS protection based on message slot (#5394)
twoeths Apr 21, 2023
99d4944
Add --nat flag (#5399)
wemeetagain Apr 21, 2023
f671360
Update spec test version to latest v1.3.0 (#5402)
g11tech Apr 22, 2023
ad0c58f
Only call regen.getBlockSlotState() if necessary (#5401)
twoeths Apr 23, 2023
97ec80e
fix: ignore known block in publish blinded block flow (#5405)
twoeths Apr 24, 2023
b889ca0
fix: prioritize voluntary_exit and bls_to_execution_change topic (#5407)
twoeths Apr 24, 2023
9d8b831
fix: use createSingleSignatureSetFromComponents when validate gossip …
twoeths Apr 24, 2023
734d80f
fix: Fix notifier bug that crept in #5297 (#5408)
g11tech Apr 24, 2023
05c93ba
Add conventional commit PR title checker (#5342)
wemeetagain Apr 24, 2023
36a9c79
v1.8.0
wemeetagain Apr 24, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/benchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
56 changes: 56 additions & 0 deletions .github/workflows/lint-pr-title.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: "Lint PR title"

on:
pull_request_target:
types:
- opened
- edited
- synchronize
- labeled
- unlabeled

jobs:
main:
name: Validate PR title
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# Configure which types are allowed (newline-delimited).
# Default: https://github.com/commitizen/conventional-commit-types
#types: |

# Configure which scopes are allowed (newline-delimited).
# These are regex patterns auto-wrapped in `^ $`.
#scopes: |

# Configure that a scope must always be provided.
requireScope: false

# Configure which scopes are disallowed in PR titles (newline-delimited).
# For instance by setting the value below, `chore(release): ...` (lowercase)
# and `ci(e2e,release): ...` (unknown scope) will be rejected.
# These are regex patterns auto-wrapped in `^ $`.
#disallowScopes: |

# Configure additional validation for the subject based on a regex.
# This example ensures the subject doesn't start with an uppercase character.
subjectPattern: ^(?![A-Z]).+$

# If `subjectPattern` is configured, you can use this property to override
# the default error message that is shown when the pattern doesn't match.
# The variables `subject` and `title` can be used within the message.
subjectPatternError: |
The subject "{subject}" found in the pull request title "{title}"
didn't match the configured pattern. Please ensure that the subject
doesn't start with an uppercase character.

# If the PR contains one of these newline-delimited labels, the
# validation is skipped. If you want to rerun the validation when
# labels change, you might want to use the `labeled` and `unlabeled`
# event triggers in your workflow.
ignoreLabels: |
bot
ignore-semantic-pull-request
2 changes: 1 addition & 1 deletion .github/workflows/publish-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-rc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-stable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-browser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-sim-merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-sim.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-spec.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
- name: Install & build
if: steps.cache-deps.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-optional && yarn build
run: yarn install --frozen-lockfile && yarn build
- name: Build
run: yarn build
if: steps.cache-deps.outputs.cache-hit == 'true'
Expand Down
26 changes: 19 additions & 7 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,25 @@ We're currently experimenting with hosting the majority of lodestar packages and
- Use `/** **/` commenting format for documenting a function/variable.
- Code whitespace can be helpful for reading complex code, please add some.
- For unit tests, we forbid import stubbing when other approaches are feasible.
- Logging framework: When determining which log level to use for providing information to users, consider the level of importance and whether the alert is actionable (Warning, Error, Fatal).
- Trace: Describes events showing step by step execution which can be ignored during standard operation.
- Debug: Useful information for debugging purposes.
- Info: Purely informative logs which can be ignored during normal operation.
- Warning: Unexpected behaviour, but the application continues to function and key operations are unaffected.
- Error: One or more main functionalities are not working, preventing some functions from working properly.
- Fatal: One or more main functionalities are not working and preventing the application from fulfilling its duties.

## Logging policy

### Logging Levels

Contributors must choose the log level carefully to ensure a consistent experience for every type of user:

- `error`: Critical issues that prevent the application from functioning correctly or cause significant disruption to users. Examples include failed network connections, crashes, or data corruption.
- `warn`: Situations that may lead to critical issues if not addressed but do not prevent the application from functioning. Examples include configuration issues, deprecated features, or temporary network disruptions.
- `info`: General sporadic informational about the node's state. Examples include initialization messages, infrequent periodic status updates, or high-level progress reports.
- `debug`: Detailed diagnostic information that can help developers or users troubleshoot specific issues. Examples include individual request logs for every REST API, networking interactions, or internal components status changes. Alias to `verbose`.

### Logging guidelines

- Avoid excessive logging. Log messages should be clear and concise, providing enough information to understand the context and severity of the issue.
- Do not log sensitive data, such as private keys, user credentials, or personal information.
- Do not log arbitrary data from the network as ASCII or UTF8 at levels higher or equal to `info`.
- Use clear and concise language. Prefer to log variables in JSON format `log.debug("Action", {slot})` instead of formatting the text yourself `log.debug('slot=${slot}')`.
- Include only relevant context in log messages, sufficient to debug the issue or action it refers to.

## Contributing to Grafana dashboards

Expand Down
62 changes: 55 additions & 7 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ The causes for a release are varied, however here are several common ones:
- To include a major bug-fix, optimization, or feature.
- To include a series of small changes which have shown to improve performance, usability, etc.
- If significant or risky PRs are waiting to merge and we wish to try and isolate those changes to a future release. I.e., to leave a "clean slate" for future PRs to apply to.
- An external team or entity needs a specific feature that the team has agreed to publish.

To start a new release, one of the Lodestar developers will communicate this via the Lodestar chat channel and seek consensus from the other developers.

Expand All @@ -23,6 +24,7 @@ To start a new release, one of the Lodestar developers will communicate this via
#### All-in-one script (for example version `v1.1.0`, commit `9fceb02`):

- The team selects a commit from `unstable` as a "release candidate" for a new version release.
- NOTE: In some rare circumstances, the team may select a commit from `stable`. This may happen if a tight deadline needs to be met and `unstable` can't be stabilized in time. We should avoid doing this unless absolutely necessary as merge conflicts and unintended consequences of cherry-picking commits may arise.
- `yarn release:create-rc 1.1.0 9fceb02`
- Must be run locally from a write-access account capable of triggering CI.
- This script may alternatively be run on the checked out `HEAD`:
Expand Down Expand Up @@ -67,13 +69,13 @@ Tagging a release candidate will trigger CI to publish to NPM, dockerhub, and Gi

Once a release candidate is created, the Lodestar team begins a testing period.

If there is a bug discovered during the testing period which significantly impacts performance, security, or stability, and it is determined that it is no longer prudent to promote the `rc.x` candidate to `stable`, then it will await a bug fix by the team. The fix will be committed, maybe back-ported to `unstable` and we publish and promote the new commit to `rc.x+1`. The 3 day testing period will reset.
If there is a bug discovered during the testing period which significantly impacts performance, security, or stability, and it is determined that it is no longer prudent to promote the `rc.x` candidate to `stable`, then it will await a bug fix by the team. The fix will be committed to `unstable` first, then cherrypicked into the `rc/v1.1.0` branch. Then we publish and promote the new commit to `rc.x+1`. The 3 day testing period will reset.

For example: After 3-5 days of testing, is performance equal to or better than latest stable?

- **Yes**: Continue to the next release step
- **No**: If it a small issue fixable quickly (hot-fix)?
- **Yes**: push fixes to branch, go to step 2, incrementing the rc version
- **Yes**: Merge fix(es) to `unstable`, push the fix(es) to `rc/v1.1.0` branch, go to step 2, incrementing the rc version
- **No**: abort the release. Close the `v1.1.0 release` PR, delete the branch, and start the whole release process over.

### 4. Merge release candidate
Expand Down Expand Up @@ -109,9 +111,56 @@ Tagging a stable release will trigger CI to publish to NPM, dockerhub, and Githu

If a stable version requires an immediate hot-fix before the next release, a hot-fix release is started.

The same process for a stable release is used, with the two differences.
A similar process for a stable release is used, with the three differences.
- The candidate commit must be chosen from the `stable` branch instead of the `unstable` branch.
- Depending on the severity of the bug being fixed, the testing window may be decreased.
- All hotfixes are committed with an `unstable` first strategy rather than directly on the RC branch itself. Hotfixes are always merged to `unstable` first, then cherry-picked into hotfix release candidates.

### 1. Create hotfix release candidate from `stable` branch

#### All-in-one script (for example version `v1.1.1`, stable commit `8eb8dce`):

- Select the latest commit from `stable` as the "hotfix release candidate" for a new hotfix version release.
- `git fetch origin stable`
- `git checkout stable`
- `yarn release:create-rc 1.1.1`
- Must be run locally from a write-access account capable of triggering CI.
- Switch to the hotfix release branch and cherrypick the inclusion(s) from the `unstable` branch to the hotfix release.
- `git checkout rc/v1.1.1`
- `git cherry-pick {commit}`
- Open draft PR from `rc/v1.1.1` to `stable` with the title `v1.1.1 release`.

#### Manual steps (for example version `v1.1.1`, commit `8eb8dce`):

- Select the latest commit from `stable` as the "hotfix release candidate" for a new hotfix release.
- Checkout `stable` branch
- `git checkout stable`
- Create a new release branch `rc/v1.1.1` at commit `8eb8dce`
- `git checkout -b rc/v1.1.1 8eb8dce`
- Set monorepo version to `v.1.1.1`.
- `lerna version v1.1.1 --no-git-tag-version --force-publish --yes`
- Commit changes
- `git commit -am "v1.1.1"`
- `git push origin rc/v1.1.1`
Open draft PR from `rc/v1.1.1` to `stable` with the title `v1.1.1 release`.

### 2. Tag release candidate

Tagging a release candidate will trigger CI to publish to NPM, dockerhub, and Github releases.

#### All-in-one script (for example version `v1.1.1`, commit `f3df9f8`):

- Select the latest commit from `rc/v1.1.1` to tag and publish.
- `yarn release:tag-rc 1.1.1`
- Must be run locally from a write-access account capable of triggering CI.

#### Manual steps (for example version `v1.1.1`, commit `f3df9f8`):

- Tag latest commit as `v1.1.1-rc.0` with an annotated tag, and push the tag.
- `git tag -am "v1.1.1-rc.0" v1.1.1-rc.0`
- `git push origin v1.1.1-rc.0`

Continue following the "test release candidate" and "merge release candidate" sections. Testing window may be modified depending on the severity of the bug fixed.

## Dev release

Expand Down Expand Up @@ -185,10 +234,9 @@ Have someone else review the release notes and then edit the release.

The release should be announced on the following social channels:

- Email: with Mailchimp.
- Discord: Use the #lodestar-announcements channel. Tag @everyone and ensure it is published to all downstream channels.
- Twitter: Short and sweet in a single tweet with twitter.com/lodestar_eth
- Reddit: TODO: get Lodestar account.
- Discord: Use the #lodestar-announcements channel. Ensure it is published to all downstream channels
- Twitter: Short and sweet in a single tweet or thread with twitter.com/lodestar_eth
- Blog post (if necessary): To outline specific changes that require additional context for users

# Release Manager Checklist
This section is to guide the Release Manager tasked with the next version release to ensure all items have been completed.
Expand Down
2 changes: 1 addition & 1 deletion docker/grafana/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:1.4

# Same version as our ansible deployments, to minimize the diff in the dashboard on export
FROM grafana/grafana:8.5.20
FROM grafana/grafana:8.5.22

# Datasource URL is configured with ENV variables
COPY datasource.yml /etc/grafana/provisioning/datasources/datasource.yml
Expand Down
1 change: 1 addition & 0 deletions docs/install/source.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Make sure to have [Yarn installed](https://classic.yarnpkg.com/en/docs/install).
<!-- prettier-ignore-start -->
!!! info
NodeJS versions older than the current LTS are not supported by Lodestar. We recommend running the latest Node LTS.
It is important to make sure the NodeJS version is not changed after reboot by setting a default `nvm alias default <version> && nvm use default`.

!!! note
Node Version Manager (NVM) will only install NodeJS for use with the active user. If you intend on setting up Lodestar to run under another user, we recommend using [Nodesource's source for NodeJS](https://github.com/nodesource/distributions/blob/master/README.md#installation-instructions) so you can install NodeJS globally.
Expand Down
Loading